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