mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Sorted out the memory leak in radar fragment
This commit is contained in:
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 viewModel: RadarViewModel by viewModels()
|
||||||
private val navArgs: RadarFragmentArgs by navArgs()
|
private val navArgs: RadarFragmentArgs by navArgs()
|
||||||
private lateinit var binding: FragmentRadarBinding
|
private val radioAdapter = RadioAdapter()
|
||||||
private lateinit var radarView: RadarView
|
private var binding: FragmentRadarBinding? = null
|
||||||
|
private var radarView: RadarView? = null
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
binding = FragmentRadarBinding.bind(view)
|
binding = FragmentRadarBinding.bind(view).apply {
|
||||||
setupComponents()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setupComponents() {
|
|
||||||
val context = requireContext()
|
|
||||||
val adapter = RadioAdapter()
|
|
||||||
val layoutManager = LinearLayoutManager(context)
|
|
||||||
val itemDecoration = DividerItemDecoration(context, layoutManager.orientation)
|
|
||||||
binding.run {
|
|
||||||
radarRecycler.apply {
|
radarRecycler.apply {
|
||||||
setHasFixedSize(true)
|
setHasFixedSize(true)
|
||||||
this.adapter = adapter
|
this.adapter = radioAdapter
|
||||||
this.layoutManager = LinearLayoutManager(context)
|
this.layoutManager = LinearLayoutManager(requireContext())
|
||||||
addItemDecoration(itemDecoration)
|
|
||||||
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
(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() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
viewModel.enableSensor()
|
viewModel.enableSensor()
|
||||||
@@ -144,4 +65,79 @@ class RadarFragment : Fragment(R.layout.fragment_radar) {
|
|||||||
super.onPause()
|
super.onPause()
|
||||||
viewModel.disableSensor()
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -35,17 +35,19 @@
|
|||||||
android:id="@+id/radio_down_img"
|
android:id="@+id/radio_down_img"
|
||||||
android:layout_width="18dp"
|
android:layout_width="18dp"
|
||||||
android:layout_height="18dp"
|
android:layout_height="18dp"
|
||||||
android:layout_marginStart="4dp"
|
android:layout_marginStart="6dp"
|
||||||
|
android:contentDescription="@string/downlink"
|
||||||
android:rotation="90"
|
android:rotation="90"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/radio_info"
|
app:layout_constraintBottom_toBottomOf="@+id/radio_info"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/radio_info"
|
app:layout_constraintTop_toTopOf="@+id/radio_info"
|
||||||
android:contentDescription="@string/downlink"
|
|
||||||
app:srcCompat="@drawable/ic_next" />
|
app:srcCompat="@drawable/ic_next" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/radio_downlink"
|
android:id="@+id/radio_downlink"
|
||||||
style="@style/RadioFreq"
|
style="@style/RadioFreq"
|
||||||
|
android:layout_marginStart="4dp"
|
||||||
|
android:layout_marginTop="3dp"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/radio_guide"
|
app:layout_constraintEnd_toStartOf="@+id/radio_guide"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/radio_info" />
|
app:layout_constraintTop_toBottomOf="@+id/radio_info" />
|
||||||
@@ -54,17 +56,18 @@
|
|||||||
android:id="@+id/radio_up_img"
|
android:id="@+id/radio_up_img"
|
||||||
android:layout_width="18dp"
|
android:layout_width="18dp"
|
||||||
android:layout_height="18dp"
|
android:layout_height="18dp"
|
||||||
android:layout_marginEnd="4dp"
|
android:layout_marginEnd="6dp"
|
||||||
|
android:contentDescription="@string/uplink"
|
||||||
android:rotation="270"
|
android:rotation="270"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/radio_info"
|
app:layout_constraintBottom_toBottomOf="@+id/radio_info"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/radio_info"
|
app:layout_constraintTop_toTopOf="@+id/radio_info"
|
||||||
android:contentDescription="@string/uplink"
|
|
||||||
app:srcCompat="@drawable/ic_next" />
|
app:srcCompat="@drawable/ic_next" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/radio_uplink"
|
android:id="@+id/radio_uplink"
|
||||||
style="@style/RadioFreq"
|
style="@style/RadioFreq"
|
||||||
|
android:layout_marginEnd="4dp"
|
||||||
app:layout_constraintBaseline_toBaselineOf="@+id/radio_downlink"
|
app:layout_constraintBaseline_toBaselineOf="@+id/radio_downlink"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="@+id/radio_guide" />
|
app:layout_constraintStart_toStartOf="@+id/radio_guide" />
|
||||||
@@ -73,7 +76,8 @@
|
|||||||
android:id="@+id/radio_mode"
|
android:id="@+id/radio_mode"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="6dp"
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
android:layout_marginBottom="4dp"
|
android:layout_marginBottom="4dp"
|
||||||
android:text="@string/trans_mode"
|
android:text="@string/trans_mode"
|
||||||
android:textSize="@dimen/text_size_small"
|
android:textSize="@dimen/text_size_small"
|
||||||
@@ -87,7 +91,7 @@
|
|||||||
android:id="@+id/radio_inverted"
|
android:id="@+id/radio_inverted"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="6dp"
|
android:layout_marginEnd="8dp"
|
||||||
android:text="@string/trans_inverted"
|
android:text="@string/trans_inverted"
|
||||||
android:textSize="@dimen/text_size_small"
|
android:textSize="@dimen/text_size_small"
|
||||||
app:layout_constraintBaseline_toBaselineOf="@+id/radio_mode"
|
app:layout_constraintBaseline_toBaselineOf="@+id/radio_mode"
|
||||||
|
|||||||
Reference in new issue
Block a user