Using alternative constructors for fragments to avoid NPE
This commit is contained in:
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user