diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt index 69f488a7..db2151d9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt @@ -38,103 +38,24 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { private val viewModel: RadarViewModel by viewModels() private val navArgs: RadarFragmentArgs by navArgs() - private lateinit var binding: FragmentRadarBinding - private lateinit var radarView: RadarView + private val radioAdapter = RadioAdapter() + private var binding: FragmentRadarBinding? = null + private var radarView: RadarView? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding = FragmentRadarBinding.bind(view) - setupComponents() - } - - private fun setupComponents() { - val context = requireContext() - val adapter = RadioAdapter() - val layoutManager = LinearLayoutManager(context) - val itemDecoration = DividerItemDecoration(context, layoutManager.orientation) - binding.run { + binding = FragmentRadarBinding.bind(view).apply { radarRecycler.apply { setHasFixedSize(true) - this.adapter = adapter - this.layoutManager = LinearLayoutManager(context) - addItemDecoration(itemDecoration) + this.adapter = radioAdapter + this.layoutManager = LinearLayoutManager(requireContext()) (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + addItemDecoration(DividerItemDecoration(requireContext(), 1)) } - setupObservers(adapter) + setupObservers() } } - private fun setupObservers(radioAdapter: RadioAdapter) { - viewModel.getPass(navArgs.catNum, navArgs.aosTime).observe(viewLifecycleOwner) { pass -> - radarView = RadarView(requireContext()).apply { - setShowAim(viewModel.getUseCompass()) - setScanning(viewModel.getShowSweep()) - } - binding.radarCard.addView(radarView) - viewModel.radarData.observe(viewLifecycleOwner) { passData -> - radarView.setPosition(passData.satPos) - radarView.setPositions(passData.satTrack) - setPassText(pass, passData.satPos) - } - viewModel.transmitters.observe(viewLifecycleOwner) { list -> - if (list.isNotEmpty()) { - radioAdapter.submitList(list) - binding.radarRecyclerMsg.text = getString(R.string.trans_data) - } else { - binding.radarRecyclerMsg.text = getString(R.string.trans_no_data) - } - radarView.invalidate() - } - viewModel.orientation.observe(viewLifecycleOwner) { value -> - radarView.setOrientation(value.first, value.second, value.third) - } - binding.radarBack.setOnClickListener { findNavController().navigateUp() } - binding.radarMap.setOnClickListener { navigateToMap(pass.catNum) } - binding.radarBtnNotify.isEnabled = false - binding.radarBtnSettings.setOnClickListener { navigateToSettings() } - } - } - - private fun setPassText(satPass: SatPass, satPos: SatPos) { - val timeNow = System.currentTimeMillis() - val radarAzim = getString(R.string.radar_az_value) - val radarElev = getString(R.string.radar_el_value) - val radarAlt = getString(R.string.radar_alt_value) - val radarDist = getString(R.string.radar_dist_value) - val radarId = getString(R.string.radar_sat_id) - binding.radarAzValue.text = String.format(radarAzim, Math.toDegrees(satPos.azimuth)) - binding.radarElValue.text = String.format(radarElev, Math.toDegrees(satPos.elevation)) - binding.radarAltValue.text = String.format(radarAlt, satPos.altitude) - binding.radarDstValue.text = String.format(radarDist, satPos.distance) - binding.radarSatId.text = String.format(radarId, satPass.catNum) - - if (!satPass.isDeepSpace) { - if (timeNow < satPass.aosTime) { - val millisBeforeStart = satPass.aosTime.minus(timeNow) - binding.radarTimer.text = millisBeforeStart.toTimerString() - } else { - val millisBeforeEnd = satPass.losTime.minus(timeNow) - binding.radarTimer.text = millisBeforeEnd.toTimerString() - if (timeNow > satPass.losTime) { - binding.radarTimer.text = 0L.toTimerString() - findNavController().navigateUp() - } - } - } else { - binding.radarTimer.text = 0L.toTimerString() - } - } - - private fun navigateToMap(catnum: Int) { - val direction = RadarFragmentDirections.actionGlobalMapFragment(catnum) - findNavController().navigate(direction) - } - - private fun navigateToSettings() { - val direction = RadarFragmentDirections.actionGlobalSettingsFragment() - findNavController().navigate(direction) - } - override fun onResume() { super.onResume() viewModel.enableSensor() @@ -144,4 +65,79 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { super.onPause() viewModel.disableSensor() } + + override fun onDestroyView() { + binding?.radarRecycler?.adapter = null + radarView = null + binding = null + super.onDestroyView() + } + + private fun setupObservers() { + viewModel.getPass(navArgs.catNum, navArgs.aosTime).observe(viewLifecycleOwner) { pass -> + binding?.run { + radarView = RadarView(requireContext()).apply { + setShowAim(viewModel.getUseCompass()) + setScanning(viewModel.getShowSweep()) + } + radarCard.addView(radarView) + viewModel.radarData.observe(viewLifecycleOwner) { passData -> + radarView?.setPosition(passData.satPos) + radarView?.setPositions(passData.satTrack) + setPassText(pass, passData.satPos) + } + viewModel.transmitters.observe(viewLifecycleOwner) { list -> + if (list.isNotEmpty()) { + radioAdapter.submitList(list) + radarRecyclerMsg.text = getString(R.string.trans_data) + } else { + radarRecyclerMsg.text = getString(R.string.trans_no_data) + } + radarView?.invalidate() + } + viewModel.orientation.observe(viewLifecycleOwner) { value -> + radarView?.setOrientation(value.first, value.second, value.third) + } + radarBack.setOnClickListener { findNavController().navigateUp() } + radarMap.setOnClickListener { + val direction = RadarFragmentDirections.actionGlobalMapFragment(pass.catNum) + findNavController().navigate(direction) + } + radarBtnNotify.isEnabled = false + radarBtnSettings.setOnClickListener { + val direction = RadarFragmentDirections.actionGlobalSettingsFragment() + findNavController().navigate(direction) + } + } + } + } + + private fun setPassText(satPass: SatPass, satPos: SatPos) { + binding?.run { + val timeNow = System.currentTimeMillis() + val radarAzim = getString(R.string.radar_az_value) + val radarElev = getString(R.string.radar_el_value) + val radarAlt = getString(R.string.radar_alt_value) + val radarDist = getString(R.string.radar_dist_value) + val radarId = getString(R.string.radar_sat_id) + radarAzValue.text = String.format(radarAzim, Math.toDegrees(satPos.azimuth)) + radarElValue.text = String.format(radarElev, Math.toDegrees(satPos.elevation)) + radarAltValue.text = String.format(radarAlt, satPos.altitude) + radarDstValue.text = String.format(radarDist, satPos.distance) + radarSatId.text = String.format(radarId, satPass.catNum) + if (!satPass.isDeepSpace) { + if (timeNow < satPass.aosTime) { + val millisBeforeStart = satPass.aosTime.minus(timeNow) + radarTimer.text = millisBeforeStart.toTimerString() + } else { + val millisBeforeEnd = satPass.losTime.minus(timeNow) + radarTimer.text = millisBeforeEnd.toTimerString() + if (timeNow > satPass.losTime) { + radarTimer.text = 0L.toTimerString() + findNavController().navigateUp() + } + } + } else radarTimer.text = 0L.toTimerString() + } + } } diff --git a/app/src/main/res/layout/item_radio.xml b/app/src/main/res/layout/item_radio.xml index 0875afcf..355c9baf 100644 --- a/app/src/main/res/layout/item_radio.xml +++ b/app/src/main/res/layout/item_radio.xml @@ -35,17 +35,19 @@ android:id="@+id/radio_down_img" android:layout_width="18dp" android:layout_height="18dp" - android:layout_marginStart="4dp" + android:layout_marginStart="6dp" + android:contentDescription="@string/downlink" android:rotation="90" app:layout_constraintBottom_toBottomOf="@+id/radio_info" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/radio_info" - android:contentDescription="@string/downlink" app:srcCompat="@drawable/ic_next" /> @@ -54,17 +56,18 @@ android:id="@+id/radio_up_img" android:layout_width="18dp" android:layout_height="18dp" - android:layout_marginEnd="4dp" + android:layout_marginEnd="6dp" + android:contentDescription="@string/uplink" android:rotation="270" app:layout_constraintBottom_toBottomOf="@+id/radio_info" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/radio_info" - android:contentDescription="@string/uplink" app:srcCompat="@drawable/ic_next" /> @@ -73,7 +76,8 @@ android:id="@+id/radio_mode" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="6dp" + android:layout_marginStart="8dp" + android:layout_marginTop="2dp" android:layout_marginBottom="4dp" android:text="@string/trans_mode" android:textSize="@dimen/text_size_small" @@ -87,7 +91,7 @@ android:id="@+id/radio_inverted" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="6dp" + android:layout_marginEnd="8dp" android:text="@string/trans_inverted" android:textSize="@dimen/text_size_small" app:layout_constraintBaseline_toBaselineOf="@+id/radio_mode"