From c2219088541d5b5e469eecd3e42e6cb58f7cc80f Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 29 Mar 2020 19:40:03 +0100 Subject: [PATCH] Using alternative constructors for fragments to avoid NPE --- .../com/rtbishop/look4sat/ui/AboutFragment.kt | 22 +-------- .../rtbishop/look4sat/ui/MapViewFragment.kt | 48 ++++--------------- .../rtbishop/look4sat/ui/PassListFragment.kt | 10 ++-- .../rtbishop/look4sat/ui/PolarViewFragment.kt | 47 ++++++------------ .../rtbishop/look4sat/ui/SatEntryDialog.kt | 10 +--- 5 files changed, 30 insertions(+), 107 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/AboutFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/AboutFragment.kt index 3e286383..43c24b5a 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/AboutFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/AboutFragment.kt @@ -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() - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt index 1cbc4f42..d2b1cb39 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MapViewFragment.kt @@ -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 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() - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt index 32646580..1ba09628 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PassListFragment.kt @@ -53,17 +53,13 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { private lateinit var satPassList: MutableList 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) diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt index 992a4325..e1e1952d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/PolarViewFragment.kt @@ -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() - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SatEntryDialog.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SatEntryDialog.kt index 2835338f..cbecb610 100755 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SatEntryDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SatEntryDialog.kt @@ -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() private var selectionList = mutableListOf() 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) } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } }