Sorted out the memory leak in radar fragment

This commit is contained in:
Arty Bishop committed 2022-02-27 10:41:46 +00:00
1 parent c58cf94181
commit 65941a8304
2 files changed
+93 -93

No files matched your search

@@ -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()
}
}
}
+10 -6
View File
@@ -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" />
<TextView
android:id="@+id/radio_downlink"
style="@style/RadioFreq"
android:layout_marginStart="4dp"
android:layout_marginTop="3dp"
app:layout_constraintEnd_toStartOf="@+id/radio_guide"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radio_info" />
@@ -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" />
<TextView
android:id="@+id/radio_uplink"
style="@style/RadioFreq"
android:layout_marginEnd="4dp"
app:layout_constraintBaseline_toBaselineOf="@+id/radio_downlink"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/radio_guide" />
@@ -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"