From 80430df1cdd85d118291759e1d1c5d1db9e05077 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sat, 4 Jan 2020 18:13:58 +0000 Subject: [PATCH] Got rid of SatNotFoundExceptions in WorldMapFragment. Minor refactoring. --- app/build.gradle | 4 - .../rtbishop/look4sat/ui/WorldMapFragment.kt | 109 +++++++++++------- build.gradle | 2 - gradle.properties | 3 +- settings.gradle | 2 +- 5 files changed, 69 insertions(+), 51 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3f32a9db..e7c45bce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,6 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: "androidx.navigation.safeargs.kotlin" -apply plugin: 'com.google.android.gms.oss-licenses-plugin' android { compileSdkVersion 29 @@ -92,7 +91,4 @@ dependencies { testImplementation "junit:junit:$junit" androidTestImplementation "androidx.test:runner:$runner" androidTestImplementation "androidx.test.espresso:espresso-core:$espresso" - - // licences - implementation "com.google.android.gms:play-services-oss-licenses:$licences" } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt index dde5181a..298a9510 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/WorldMapFragment.kt @@ -34,28 +34,30 @@ import com.github.amsacode.predict4java.* import com.google.android.material.floatingactionbutton.FloatingActionButton import com.rtbishop.look4sat.MainViewModel import com.rtbishop.look4sat.R +import com.rtbishop.look4sat.repo.SatPass import java.util.* import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit import kotlin.math.abs class WorldMapFragment : Fragment() { - private val service = Executors.newSingleThreadScheduledExecutor() + private lateinit var service: ScheduledExecutorService + private lateinit var mainActivity: MainActivity private lateinit var viewModel: MainViewModel - private lateinit var trackView: TrackView private lateinit var mapFrame: FrameLayout private lateinit var fab: FloatingActionButton + private lateinit var trackView: TrackView private lateinit var predictor: PassPredictor - private lateinit var mainActivity: MainActivity private lateinit var selectedSat: TLE - private lateinit var tleMainList: List - private lateinit var tleSelection: MutableList private lateinit var gsp: GroundStationPosition + private lateinit var satPassList: List private var checkedItem = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + service = Executors.newSingleThreadScheduledExecutor() mainActivity = activity as MainActivity viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java) } @@ -81,14 +83,15 @@ class WorldMapFragment : Fragment() { private fun setupComponents() { val delay = viewModel.delay - tleMainList = viewModel.tleMainList - tleSelection = viewModel.tleSelection - gsp = viewModel.gsp.value!! - - if (tleMainList.isNotEmpty() && tleSelection.isNotEmpty()) { - fab.setOnClickListener { showSelectSatDialog(tleMainList, tleSelection) } - selectedSat = tleMainList[tleSelection[0]] - predictor = PassPredictor(selectedSat, viewModel.gsp.value) + gsp = viewModel.gsp.value ?: GroundStationPosition(0.0, 0.0, 0.0) + satPassList = viewModel.passSatList.value ?: emptyList() + + if (satPassList.isNotEmpty()) { + satPassList = satPassList.distinctBy { it.tle } + satPassList = satPassList.sortedBy { it.tle.name } + fab.setOnClickListener { showSelectSatDialog(satPassList) } + selectedSat = satPassList.first().tle + predictor = satPassList.first().predictor trackView = TrackView(mainActivity) mapFrame.addView(trackView) service.scheduleAtFixedRate( @@ -108,19 +111,19 @@ class WorldMapFragment : Fragment() { } } - private fun showSelectSatDialog(tleMainList: List, selectionList: MutableList) { - val tleNameArray = arrayOfNulls(selectionList.size).apply { - selectionList.withIndex().forEach { (index, selection) -> - this[index] = tleMainList[selection].name + private fun showSelectSatDialog(list: List) { + val tleArray = arrayOfNulls(list.size).apply { + list.withIndex().forEach { + this[it.index] = it.value.tle.name } } val builder = AlertDialog.Builder(mainActivity) builder.setTitle(getString(R.string.dialog_show_track)) - .setSingleChoiceItems(tleNameArray, checkedItem) { dialog, which -> + .setSingleChoiceItems(tleArray, checkedItem) { dialog, which -> checkedItem = which - selectedSat = tleMainList[selectionList[which]] - predictor = PassPredictor(selectedSat, gsp) + selectedSat = list[which].tle + predictor = list[which].predictor trackView.invalidate() dialog.dismiss() } @@ -164,24 +167,22 @@ class WorldMapFragment : Fragment() { val degLon = width / 360f val degLat = height / 180f drawHomeLoc(canvas, degLon, degLat) - val currentTime = getDateFor(System.currentTimeMillis()) val orbitalPeriod = (24 * 60 / selectedSat.meanmo).toInt() - val satPosList = predictor.getPositions(currentTime, 60, 0, orbitalPeriod * 3) - drawGroundTrack(canvas, degLon, degLat, satPosList) - - tleSelection.forEach { - drawSat(it, currentTime, canvas, degLon, degLat) + val positions = predictor.getPositions(currentTime, 60, 0, orbitalPeriod * 3) + drawGroundTrack(canvas, degLon, degLat, positions) + satPassList.forEach { + drawSat(canvas, degLon, degLat, it.tle, it.predictor, currentTime) } } - private fun drawHomeLoc(cvs: Canvas, degLon: Float, degLat: Float) { + private fun drawHomeLoc(canvas: Canvas, degLon: Float, degLat: Float) { val lon = gsp.longitude.toFloat() val lat = gsp.latitude.toFloat() * -1 val cx = lon * degLon val cy = lat * degLat - cvs.drawCircle(cx, cy, scale * 2, txtPaint) - cvs.drawText( + canvas.drawCircle(cx, cy, scale * 2, txtPaint) + canvas.drawText( context.getString(R.string.map_gsp), cx - txtPaint.textSize, cy - txtPaint.textSize, @@ -189,7 +190,12 @@ class WorldMapFragment : Fragment() { ) } - private fun drawGroundTrack(cvs: Canvas, degLon: Float, degLat: Float, list: List) { + private fun drawGroundTrack( + canvas: Canvas, + degLon: Float, + degLat: Float, + list: List + ) { val path = Path() var lon: Float var lat: Float @@ -209,19 +215,29 @@ class WorldMapFragment : Fragment() { lastLon = lon } - cvs.drawPath(path, groundTrackPaint) + canvas.drawPath(path, groundTrackPaint) } - private fun drawSat(index: Int, date: Date, canvas: Canvas, degLon: Float, degLat: Float) { - val tle = tleMainList[index] - val predictor = PassPredictor(tle, gsp) + private fun drawSat( + canvas: Canvas, + degLon: Float, + degLat: Float, + tle: TLE, + predictor: PassPredictor, + date: Date + ) { val satPosNow = predictor.getSatPos(date) val footprintPosList = satPosNow.rangeCircle drawFootprint(canvas, degLon, degLat, footprintPosList) drawName(canvas, degLon, degLat, satPosNow, tle.name) } - private fun drawFootprint(cvs: Canvas, degLon: Float, degLat: Float, list: List) { + private fun drawFootprint( + canvas: Canvas, + degLon: Float, + degLat: Float, + list: List + ) { val path = Path() var lon: Float var lat: Float @@ -241,19 +257,28 @@ class WorldMapFragment : Fragment() { lastLon = lon } - cvs.drawPath(path, footprintPaint) + canvas.drawPath(path, footprintPaint) } - private fun drawName(cvs: Canvas, degLon: Float, degLat: Float, pos: SatPos, name: String) { - var lon = rad2Deg(pos.longitude).toFloat() - val lat = rad2Deg(pos.latitude).toFloat() * -1 + private fun drawName( + canvas: Canvas, + degLon: Float, + degLat: Float, + position: SatPos, + name: String + ) { + var lon = rad2Deg(position.longitude).toFloat() + val lat = rad2Deg(position.latitude).toFloat() * -1 + if (lon > 180f) lon -= 360f + val cx = lon * degLon val cy = lat * degLat - cvs.drawCircle(cx, cy, scale * 2, txtPaint) + + canvas.drawCircle(cx, cy, scale * 2, txtPaint) txtPaint.getTextBounds(name, 0, name.length, rect) - cvs.drawText(name, cx - rect.width() / 2, cy - txtPaint.textSize, outlinePaint) - cvs.drawText(name, cx - rect.width() / 2, cy - txtPaint.textSize, txtPaint) + canvas.drawText(name, cx - rect.width() / 2, cy - txtPaint.textSize, outlinePaint) + canvas.drawText(name, cx - rect.width() / 2, cy - txtPaint.textSize, txtPaint) } private fun getDateFor(value: Long): Date { diff --git a/build.gradle b/build.gradle index c7be2df0..569530b9 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,4 @@ ext { junit = "4.12" runner = '1.1.1' espresso = '3.2.0' - - licences = '17.0.0' } diff --git a/gradle.properties b/gradle.properties index 988bc560..13cac6cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,5 +18,4 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -kapt.incremental.apt=true \ No newline at end of file +kotlin.code.style=official \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 145d71d1..1c788441 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ include ':app' -rootProject.name='LookingSat' +rootProject.name='Look4Sat'