Using alternative constructors for fragments to avoid NPE

This commit is contained in:
Arty Bishop committed 2020-03-29 19:40:03 +01:00
1 parent bd2891e9a2
commit c221908854
5 files changed
+30 -107

No files matched your search

@@ -21,37 +21,19 @@ package com.rtbishop.look4sat.ui
import android.os.Bundle import android.os.Bundle
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.rtbishop.look4sat.BuildConfig import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentAboutBinding import com.rtbishop.look4sat.databinding.FragmentAboutBinding
class AboutFragment : Fragment() { class AboutFragment : Fragment(R.layout.fragment_about) {
private var _binding: FragmentAboutBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentAboutBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val binding = FragmentAboutBinding.bind(view)
binding.tvAboutVersion.text = binding.tvAboutVersion.text =
String.format(getString(R.string.app_version), BuildConfig.VERSION_NAME) String.format(getString(R.string.app_version), BuildConfig.VERSION_NAME)
binding.tvAboutMessage.movementMethod = LinkMovementMethod.getInstance() binding.tvAboutMessage.movementMethod = LinkMovementMethod.getInstance()
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -22,9 +22,7 @@ package com.rtbishop.look4sat.ui
import android.content.Context import android.content.Context
import android.graphics.* import android.graphics.*
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@@ -41,16 +39,11 @@ import com.rtbishop.look4sat.predict4kotlin.PassPredictor
import com.rtbishop.look4sat.repo.SatPass import com.rtbishop.look4sat.repo.SatPass
import java.util.* import java.util.*
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.abs import kotlin.math.abs
class MapViewFragment : Fragment() { class MapViewFragment : Fragment(R.layout.fragment_map_view) {
private var _binding: FragmentMapViewBinding? = null
private val binding get() = _binding!!
private lateinit var service: ScheduledExecutorService
private lateinit var mainActivity: MainActivity private lateinit var mainActivity: MainActivity
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var mapView: MapView private lateinit var mapView: MapView
@@ -60,29 +53,12 @@ class MapViewFragment : Fragment() {
private lateinit var satPassList: List<SatPass> private lateinit var satPassList: List<SatPass>
private var checkedItem = 0 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)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMapViewBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupComponents() val binding = FragmentMapViewBinding.bind(view)
} val service = Executors.newSingleThreadScheduledExecutor()
mainActivity = activity as MainActivity
private fun setupComponents() { viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
val refreshRate = viewModel.getRefreshRate()
gsp = viewModel.getGSP().value ?: GroundStationPosition(0.0, 0.0, 0.0) gsp = viewModel.getGSP().value ?: GroundStationPosition(0.0, 0.0, 0.0)
satPassList = viewModel.getSatPassList().value ?: emptyList() satPassList = viewModel.getSatPassList().value ?: emptyList()
@@ -92,12 +68,12 @@ class MapViewFragment : Fragment() {
binding.fabMap.setOnClickListener { showSelectSatDialog(satPassList) } binding.fabMap.setOnClickListener { showSelectSatDialog(satPassList) }
selectedSat = satPassList.first().tle selectedSat = satPassList.first().tle
predictor = satPassList.first().predictor predictor = satPassList.first().predictor
mapView = MapView(mainActivity) mapView = MapView(mainActivity, binding)
binding.frameMap.addView(mapView) binding.frameMap.addView(mapView)
service.scheduleAtFixedRate( service.scheduleAtFixedRate(
{ mapView.invalidate() }, { mapView.invalidate() },
refreshRate, viewModel.getRefreshRate(),
refreshRate, viewModel.getRefreshRate(),
TimeUnit.MILLISECONDS TimeUnit.MILLISECONDS
) )
} else { } else {
@@ -131,7 +107,8 @@ class MapViewFragment : Fragment() {
.show() .show()
} }
inner class MapView(context: Context) : View(context) { inner class MapView(context: Context, private val binding: FragmentMapViewBinding) :
View(context) {
private val scale = resources.displayMetrics.density private val scale = resources.displayMetrics.density
private val groundTrackPaint = Paint().apply { private val groundTrackPaint = Paint().apply {
isAntiAlias = true isAntiAlias = true
@@ -318,9 +295,4 @@ class MapViewFragment : Fragment() {
return value * 180 / Math.PI return value * 180 / Math.PI
} }
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -53,17 +53,13 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) {
private lateinit var satPassList: MutableList<SatPass> private lateinit var satPassList: MutableList<SatPass>
private var isTimerSet: Boolean = false private var isTimerSet: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onViewCreated(view, savedInstanceState)
val fragmentBinding = FragmentPassListBinding.bind(view)
mainActivity = activity as MainActivity mainActivity = activity as MainActivity
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java) viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
satPassAdapter = SatPassAdapter(viewModel) satPassAdapter = SatPassAdapter(viewModel)
satPassList = mutableListOf() satPassList = mutableListOf()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val fragmentBinding = FragmentPassListBinding.bind(view)
aosTimerText = mainActivity.findViewById(R.id.toolbar_timer) aosTimerText = mainActivity.findViewById(R.id.toolbar_timer)
btnPassPrefs = mainActivity.findViewById(R.id.toolbar_filter) btnPassPrefs = mainActivity.findViewById(R.id.toolbar_filter)
setupComponents(fragmentBinding) setupComponents(fragmentBinding)
@@ -24,9 +24,7 @@ import android.graphics.Canvas
import android.graphics.Paint import android.graphics.Paint
import android.graphics.Path import android.graphics.Path
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -46,44 +44,28 @@ import java.util.concurrent.TimeUnit
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
class PolarViewFragment : Fragment() { class PolarViewFragment : Fragment(R.layout.fragment_polar_view) {
private val service = Executors.newSingleThreadScheduledExecutor() private val service = Executors.newSingleThreadScheduledExecutor()
private val args: PolarViewFragmentArgs by navArgs() private val args: PolarViewFragmentArgs by navArgs()
private var _binding: FragmentPolarViewBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
private lateinit var satPass: SatPass private lateinit var satPass: SatPass
private lateinit var polarView: PolarView private lateinit var polarView: PolarView
private lateinit var transmitterAdapter: TransmitterAdapter private lateinit var transmitterAdapter: TransmitterAdapter
private lateinit var mainActivity: MainActivity private lateinit var mainActivity: MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainActivity = activity as MainActivity
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentPolarViewBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val binding = FragmentPolarViewBinding.bind(view)
mainActivity = activity as MainActivity
viewModel = ViewModelProvider(mainActivity).get(MainViewModel::class.java)
viewModel.getSatPassList().value?.let { viewModel.getSatPassList().value?.let {
val refreshRate = viewModel.getRefreshRate() val refreshRate = viewModel.getRefreshRate()
satPass = it[args.satPassIndex] satPass = it[args.satPassIndex]
mainActivity.supportActionBar?.title = satPass.tle.name mainActivity.supportActionBar?.title = satPass.tle.name
polarView = PolarView(mainActivity, refreshRate) polarView = PolarView(mainActivity, refreshRate, binding)
binding.framePolar.addView(polarView) binding.framePolar.addView(polarView)
service.scheduleAtFixedRate( service.scheduleAtFixedRate(
{ polarView.invalidate() }, { polarView.invalidate() },
@@ -92,11 +74,11 @@ class PolarViewFragment : Fragment() {
TimeUnit.MILLISECONDS TimeUnit.MILLISECONDS
) )
setupTransRecycler() setupTransRecycler(binding)
} }
} }
private fun setupTransRecycler() { private fun setupTransRecycler(binding: FragmentPolarViewBinding) {
transmitterAdapter = TransmitterAdapter() transmitterAdapter = TransmitterAdapter()
binding.recPolar.apply { binding.recPolar.apply {
layoutManager = LinearLayoutManager(mainActivity) layoutManager = LinearLayoutManager(mainActivity)
@@ -114,7 +96,12 @@ class PolarViewFragment : Fragment() {
} }
} }
inner class PolarView(context: Context, updateFreq: Long) : View(context) { inner class PolarView(
context: Context,
private val updateFreq: Long,
private val binding: FragmentPolarViewBinding
) :
View(context) {
private val radarSize = resources.displayMetrics.widthPixels private val radarSize = resources.displayMetrics.widthPixels
private val scale = resources.displayMetrics.density private val scale = resources.displayMetrics.density
@@ -124,7 +111,6 @@ class PolarViewFragment : Fragment() {
private val piDiv2 = Math.PI / 2.0 private val piDiv2 = Math.PI / 2.0
private val txtSize = scale * 15 private val txtSize = scale * 15
private val center = 0f private val center = 0f
private val delay = updateFreq
private val radarPaint = Paint().apply { private val radarPaint = Paint().apply {
isAntiAlias = true isAntiAlias = true
@@ -223,7 +209,7 @@ class PolarViewFragment : Fragment() {
} else { } else {
path.lineTo(satPassX, satPassY) path.lineTo(satPassX, satPassY)
} }
startTime.time += delay startTime.time += updateFreq
} }
cvs.drawPath(path, trackPaint) cvs.drawPath(path, trackPaint)
} }
@@ -253,9 +239,4 @@ class PolarViewFragment : Fragment() {
return value * 180 / Math.PI return value * 180 / Math.PI
} }
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }
@@ -36,15 +36,12 @@ class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener
private lateinit var satEntryAdapter: SatEntryAdapter private lateinit var satEntryAdapter: SatEntryAdapter
private lateinit var entriesListener: EntriesSubmitListener private lateinit var entriesListener: EntriesSubmitListener
private var _binding: DialogSatEntryBinding? = null
private val binding get() = _binding!!
private var entriesList = mutableListOf<SatEntry>() private var entriesList = mutableListOf<SatEntry>()
private var selectionList = mutableListOf<Int>() private var selectionList = mutableListOf<Int>()
private var selectAllToggle = true private var selectAllToggle = true
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
_binding = DialogSatEntryBinding.inflate(requireActivity().layoutInflater) val binding = DialogSatEntryBinding.inflate(requireActivity().layoutInflater)
val satEntryDialog = Dialog(requireActivity()).apply { val satEntryDialog = Dialog(requireActivity()).apply {
window?.requestFeature(Window.FEATURE_NO_TITLE) window?.requestFeature(Window.FEATURE_NO_TITLE)
setContentView(binding.root) setContentView(binding.root)
@@ -147,9 +144,4 @@ class SatEntryDialog : AppCompatDialogFragment(), SearchView.OnQueryTextListener
interface EntriesSubmitListener { interface EntriesSubmitListener {
fun onEntriesSubmit(list: MutableList<Int>) fun onEntriesSubmit(list: MutableList<Int>)
} }
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
} }