From d0c7dd62e8fae0983cb88dcfa1fcf2a508c2a00f Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Fri, 13 Dec 2019 10:25:09 +0000 Subject: [PATCH] Implemented a temporary but functional way to show passes of the selected satellites on the WorldMap --- .../rtbishop/lookingsat/ui/RadarFragment.kt | 14 +-- .../lookingsat/ui/WorldMapFragment.kt | 107 ++++++++++-------- 2 files changed, 64 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt index e43fe56d..74af27c9 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/RadarFragment.kt @@ -43,7 +43,8 @@ class RadarFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + mainActivity = activity as MainActivity + viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java) } override fun onCreateView( @@ -58,7 +59,6 @@ class RadarFragment : Fragment() { super.onViewCreated(view, savedInstanceState) val delay = viewModel.updateFreq satPass = arguments?.get("satPass") as SatPass - mainActivity = activity as MainActivity mainActivity.supportActionBar?.title = satPass.tle.name radarSkyFrame = view.findViewById(R.id.radar_sky_frame) @@ -71,7 +71,7 @@ class RadarFragment : Fragment() { radarView = RadarView(mainActivity, delay) radarSkyFrame.addView(radarView) - service.scheduleAtFixedRate({ radarView.invalidate() }, 0, delay, TimeUnit.MILLISECONDS) + service.scheduleAtFixedRate({ radarView.invalidate() }, delay, delay, TimeUnit.MILLISECONDS) setupTransRecycler() } @@ -116,24 +116,24 @@ class RadarFragment : Fragment() { } private val radarPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.lightOnDark, (activity as MainActivity).theme) + color = resources.getColor(R.color.lightOnDark, mainActivity.theme) style = Paint.Style.STROKE strokeWidth = scale } private val txtPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.themeAccent, (activity as MainActivity).theme) + color = resources.getColor(R.color.themeAccent, mainActivity.theme) textSize = txtSize } private val trackPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satTrack, (activity as MainActivity).theme) + color = resources.getColor(R.color.satTrack, mainActivity.theme) style = Paint.Style.STROKE strokeWidth = scale } private val satPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.themeAccent, (activity as MainActivity).theme) + color = resources.getColor(R.color.themeAccent, mainActivity.theme) style = Paint.Style.FILL } private val path: Path = Path() diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt index 5538bac3..64dd9789 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/WorldMapFragment.kt @@ -10,12 +10,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.github.amsacode.predict4java.PassPredictor import com.github.amsacode.predict4java.Position import com.github.amsacode.predict4java.SatPos import com.github.amsacode.predict4java.TLE +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R import java.util.* @@ -31,13 +34,16 @@ class WorldMapFragment : Fragment() { private lateinit var viewModel: MainViewModel private lateinit var trackView: TrackView private lateinit var mapFrame: FrameLayout - // private lateinit var fab: FloatingActionButton - private lateinit var selectedSat: TLE + private lateinit var fab: FloatingActionButton private lateinit var predictor: PassPredictor + private lateinit var mainActivity: MainActivity + private lateinit var selectedSat: TLE + private var checkedItem = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + mainActivity = activity as MainActivity + viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java) } override fun onCreateView( @@ -50,70 +56,71 @@ class WorldMapFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mapFrame = view.findViewById(R.id.worldmap_frame) -// fab = view.findViewById(R.id.worldmap_fab) -// fab.setOnClickListener { showSelectSatDialog() } - val delay = viewModel.updateFreq - val tleString = arrayOf( - "METEOR-M2 2", - "1 44387U 19038A 19336.45319619 -.00000025 00000-0 80323-5 0 9996", - "2 44387 98.5920 295.7459 0002200 37.8724 322.2609 14.23335951 21369" - ) + val tleMainList = viewModel.tleMainList + val selectionList = viewModel.selectionList + mapFrame = view.findViewById(R.id.worldmap_frame) + fab = view.findViewById(R.id.worldmap_fab) - selectedSat = TLE(tleString) - predictor = PassPredictor(selectedSat, viewModel.gsp.value) - -// selectedSat = viewModel.selectedSingleSat -// lifecycleScope.launch { -// predictor = PassPredictor(selectedSat, viewModel.gsp.value) -// } - - trackView = TrackView(activity as MainActivity) - mapFrame.addView(trackView) - service.scheduleAtFixedRate({ trackView.invalidate() }, 0, delay, TimeUnit.MILLISECONDS) + if (tleMainList.isNotEmpty() && selectionList.isNotEmpty()) { + fab.setOnClickListener { showSelectSatDialog(tleMainList, selectionList) } + selectedSat = tleMainList[selectionList[0]] + predictor = PassPredictor(selectedSat, viewModel.gsp.value) + trackView = TrackView(mainActivity) + mapFrame.addView(trackView) + service.scheduleAtFixedRate( + { trackView.invalidate() }, + delay, + delay, + TimeUnit.MILLISECONDS + ) + } else { + fab.setOnClickListener { + Toast.makeText(mainActivity, "No satellites were shortlisted", Toast.LENGTH_SHORT) + .show() + } + } } -// private fun showSelectSatDialog() { -// val tleMainList = viewModel.tleMainList -// val tleNameArray = arrayOfNulls(tleMainList.size) -// var selection = viewModel.selectedSingleSat -// -// tleMainList.withIndex().forEach { (position, tle) -> -// tleNameArray[position] = tle.name -// } -// -// val builder = AlertDialog.Builder(activity as MainActivity) -// builder.setTitle("Select Sat to track") -// .setSingleChoiceItems(tleNameArray, -1) { _, which -> -// selection = tleMainList[which] -// } -// .setPositiveButton("Ok") { _, _ -> -// viewModel.updateSelectedSingleSat(selection) -// } -// .setNegativeButton("Cancel") { dialog, _ -> -// dialog.cancel() -// } -// .create() -// .show() -// } + private fun showSelectSatDialog(tleMainList: List, selectionList: MutableList) { + val tleNameArray = arrayOfNulls(selectionList.size).apply { + selectionList.withIndex().forEach { (index, selection) -> + this[index] = tleMainList[selection].name + } + } + + val builder = AlertDialog.Builder(mainActivity) + builder.setTitle("Select Sat to track") + .setSingleChoiceItems(tleNameArray, checkedItem) { _, which -> + checkedItem = which + } + .setPositiveButton("Ok") { _, _ -> + selectedSat = tleMainList[selectionList[checkedItem]] + predictor = PassPredictor(selectedSat, viewModel.gsp.value) + } + .setNegativeButton("Cancel") { dialog, _ -> + dialog.cancel() + } + .create() + .show() + } inner class TrackView(context: Context) : View(context) { private val groundTrackPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satTrack, (activity as MainActivity).theme) + color = resources.getColor(R.color.satTrack, mainActivity.theme) style = Paint.Style.STROKE strokeWidth = scale } private val footprintPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satFootprint, (activity as MainActivity).theme) + color = resources.getColor(R.color.satFootprint, mainActivity.theme) style = Paint.Style.STROKE strokeWidth = scale } private val homeLocPaint = Paint().apply { isAntiAlias = true - color = resources.getColor(R.color.satFootprint, (activity as MainActivity).theme) + color = resources.getColor(R.color.satFootprint, mainActivity.theme) style = Paint.Style.FILL strokeWidth = scale } @@ -128,7 +135,7 @@ class WorldMapFragment : Fragment() { val orbitalPeriod = (24 * 60 / selectedSat.meanmo).toInt() val satPos = predictor.getSatPos(currentTime) val footprintPositions = satPos.rangeCircle - val positions = predictor.getPositions(currentTime, 60, 0, orbitalPeriod * 3) + val positions = predictor.getPositions(currentTime, 60, 15, orbitalPeriod * 3) drawGroundTrack(canvas, frameWidth, frameHeight, positions) drawFootprint(canvas, frameWidth, frameHeight, footprintPositions) var longitude = rad2Deg(satPos.longitude)