Optimized PassesAdapter and ViewHolders

This commit is contained in:
Arty Bishop committed 2020-10-06 23:24:17 +01:00
1 parent 0ba26d4d75
commit 4e0aa1481b
2 files changed
+38 -40

No files matched your search

@@ -33,14 +33,18 @@ import com.rtbishop.look4sat.ui.fragments.PassesFragmentDirections
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
class PassesAdapter(private var satPassList: MutableList<SatPass> = mutableListOf()) : class PassesAdapter(context: Context, private var shouldUseUTC: Boolean = false) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() { RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var shouldUseUTC: Boolean = false private val satIdFormat = context.getString(R.string.pass_satId)
private val azFormat = context.getString(R.string.pat_azimuth)
fun setShouldUseUTC(boolean: Boolean) { private val elevFormat = context.getString(R.string.pat_elevation)
shouldUseUTC = boolean private val aosAzFormat = context.getString(R.string.pass_aos_az)
} private val losAzFormat = context.getString(R.string.pass_los_az)
private val dateFormat = context.getString(R.string.pass_dateTime)
private val timeZoneUTC = TimeZone.getTimeZone("UTC")
private val simpleDateFormat = SimpleDateFormat(dateFormat, Locale.getDefault())
private var satPassList: MutableList<SatPass> = mutableListOf()
fun setList(list: MutableList<SatPass>) { fun setList(list: MutableList<SatPass>) {
satPassList = list satPassList = list
@@ -48,18 +52,18 @@ class PassesAdapter(private var satPassList: MutableList<SatPass> = mutableListO
} }
fun updateRecycler() { fun updateRecycler() {
val timeNow = Date() val timeNow = System.currentTimeMillis()
val iterator = satPassList.listIterator() val iterator = satPassList.listIterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
val satPass = iterator.next() val satPass = iterator.next()
if (satPass.progress < 100) { if (satPass.progress < 100) {
val timeStart = satPass.pass.startTime val timeStart = satPass.pass.startTime.time
val timeEnd = satPass.pass.endTime val timeEnd = satPass.pass.endTime.time
if (timeNow.after(timeStart)) { if (timeNow.minus(timeStart) > 0) {
satPass.active = true satPass.active = true
val index = satPassList.indexOf(satPass) val index = satPassList.indexOf(satPass)
val deltaTotal = timeEnd.time.minus(timeStart.time) val deltaTotal = timeEnd.minus(timeStart)
val deltaNow = timeNow.time.minus(timeStart.time) val deltaNow = timeNow.minus(timeStart)
satPass.progress = ((deltaNow.toFloat() / deltaTotal.toFloat()) * 100).toInt() satPass.progress = ((deltaNow.toFloat() / deltaTotal.toFloat()) * 100).toInt()
notifyItemChanged(index) notifyItemChanged(index)
} }
@@ -104,26 +108,21 @@ class PassesAdapter(private var satPassList: MutableList<SatPass> = mutableListO
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(itemView) {
fun bind(satPass: SatPass) { fun bind(satPass: SatPass) {
val context: Context = itemView.context binding.apply {
if (satPass.active) binding.passLeoImg.setImageResource(R.drawable.ic_pass_active) if (satPass.active) passLeoImg.setImageResource(R.drawable.ic_pass_active)
else binding.passLeoImg.setImageResource(R.drawable.ic_pass_inactive) else passLeoImg.setImageResource(R.drawable.ic_pass_inactive)
binding.passLeoSatName.text = satPass.tle.name passLeoSatName.text = satPass.tle.name
binding.passLeoSatId.text = passLeoSatId.text = String.format(satIdFormat, satPass.tle.catnum)
String.format(context.getString(R.string.pass_satId), satPass.tle.catnum) passLeoMaxEl.text = String.format(elevFormat, satPass.pass.maxEl)
binding.passLeoMaxEl.text = passLeoAosAz.text = String.format(aosAzFormat, satPass.pass.aosAzimuth)
String.format(context.getString(R.string.pat_elevation), satPass.pass.maxEl) passLeoLosAz.text = String.format(losAzFormat, satPass.pass.losAzimuth)
binding.passLeoAosAz.text = passLeoProgress.progress = satPass.progress
String.format(context.getString(R.string.pass_aos_az), satPass.pass.aosAzimuth)
binding.passLeoLosAz.text =
String.format(context.getString(R.string.pass_los_az), satPass.pass.losAzimuth)
binding.passLeoProgress.progress = satPass.progress
val dateFormat = if (shouldUseUTC) simpleDateFormat.timeZone = timeZoneUTC
SimpleDateFormat(context.getString(R.string.pass_dateTime), Locale.getDefault()) passLeoAosTime.text = simpleDateFormat.format(satPass.pass.startTime)
if (shouldUseUTC) dateFormat.timeZone = TimeZone.getTimeZone("UTC") passLeoLosTime.text = simpleDateFormat.format(satPass.pass.endTime)
binding.passLeoAosTime.text = dateFormat.format(satPass.pass.startTime) }
binding.passLeoLosTime.text = dateFormat.format(satPass.pass.endTime)
itemView.setOnClickListener { itemView.setOnClickListener {
val passIndex = satPassList.indexOf(satPass) val passIndex = satPassList.indexOf(satPass)
@@ -137,16 +136,15 @@ class PassesAdapter(private var satPassList: MutableList<SatPass> = mutableListO
RecyclerView.ViewHolder(itemView) { RecyclerView.ViewHolder(itemView) {
fun bind(satPass: SatPass) { fun bind(satPass: SatPass) {
val context: Context = itemView.context
val satPos = satPass.predictor.getSatPos(satPass.pass.startTime) val satPos = satPass.predictor.getSatPos(satPass.pass.startTime)
val azimuth = satPos.azimuth * 180 / Math.PI val azimuth = Math.toDegrees(satPos.azimuth)
binding.passGeoName.text = satPass.tle.name binding.apply {
binding.passGeoId.text = passGeoName.text = satPass.tle.name
String.format(context.getString(R.string.pass_satId), satPass.tle.catnum) passGeoId.text = String.format(satIdFormat, satPass.tle.catnum)
binding.passGeoAz.text = String.format(context.getString(R.string.pat_azimuth), azimuth) passGeoAz.text = String.format(azFormat, azimuth)
binding.passGeoEl.text = passGeoEl.text = String.format(elevFormat, satPass.pass.maxEl)
String.format(context.getString(R.string.pat_elevation), satPass.pass.maxEl) }
itemView.setOnClickListener { itemView.setOnClickListener {
val passIndex = satPassList.indexOf(satPass) val passIndex = satPassList.indexOf(satPass)
@@ -55,8 +55,8 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
private lateinit var aosTimer: CountDownTimer private lateinit var aosTimer: CountDownTimer
private lateinit var binding: FragmentPassesBinding private lateinit var binding: FragmentPassesBinding
private lateinit var animator: ObjectAnimator private lateinit var animator: ObjectAnimator
private lateinit var passesAdapter: PassesAdapter
private val viewModel: SharedViewModel by activityViewModels { factory } private val viewModel: SharedViewModel by activityViewModels { factory }
private val passesAdapter = PassesAdapter()
private var isTimerSet: Boolean = false private var isTimerSet: Boolean = false
private var passes = mutableListOf<SatPass>() private var passes = mutableListOf<SatPass>()
@@ -83,6 +83,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
} }
private fun setupComponents() { private fun setupComponents() {
passesAdapter = PassesAdapter(requireContext(), prefsManager.shouldUseUTC())
binding.apply { binding.apply {
passesRecycler.apply { passesRecycler.apply {
layoutManager = LinearLayoutManager(requireContext()) layoutManager = LinearLayoutManager(requireContext())
@@ -104,7 +105,6 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
} }
} }
} }
passesAdapter.setShouldUseUTC(prefsManager.shouldUseUTC())
setTimerForPasses(passes) setTimerForPasses(passes)
viewModel.triggerCalculation() viewModel.triggerCalculation()
} }