From 52b23bf62810116386bc240953fa8e3a3024f3fb Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sat, 30 Nov 2019 23:52:06 +0000 Subject: [PATCH] Now reusing satPassList for the recycler view rather than generating it again. Minor refactoring. --- .../com/rtbishop/lookingsat/MainViewModel.kt | 20 +++++++------- .../rtbishop/lookingsat/ui/SatPassAdapter.kt | 18 ++++++++----- .../com/rtbishop/lookingsat/ui/SkyFragment.kt | 26 +++++++++++++------ app/src/main/res/layout/fragment_sky.xml | 1 - app/src/main/res/layout/sat_pass_pref.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 6 files changed, 42 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt index 5d19a1ad..26cdb345 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/MainViewModel.kt @@ -45,6 +45,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { (application as LookingSatApp).appComponent.inject(this) } + var satPassList = emptyList() + val gsp = MutableLiveData( GroundStationPosition( preferences.getDouble(keyLat, 0.0), @@ -70,15 +72,15 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } } - suspend fun getPasses(): List { - val satPassList = mutableListOf() + suspend fun getPasses() { + val passList = mutableListOf() withContext(Dispatchers.Default) { tleSelectedMap.forEach { (tle, value) -> if (value) { try { val predictor = PassPredictor(tle, gsp.value) val passes = predictor.getPasses(Date(), passPrefs.hoursAhead, false) - passes.forEach { satPassList.add(SatPass(tle, predictor, it)) } + passes.forEach { passList.add(SatPass(tle, predictor, it)) } } catch (exception: IllegalArgumentException) { debugMessage.postValue("There was a problem with TLE") } catch (exception: SatNotFoundException) { @@ -86,10 +88,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } } } - satPassList.retainAll { it.pass.maxEl >= passPrefs.maxEl } - satPassList.sortBy { it.pass.startTime } + passList.retainAll { it.pass.maxEl >= passPrefs.maxEl } + passList.sortBy { it.pass.startTime } } - return satPassList + satPassList = passList } fun updateSelectedSatMap(mutableMap: MutableMap) { @@ -150,8 +152,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } } -fun SharedPreferences.Editor.putDouble(key: String, double: Double): SharedPreferences.Editor = - putLong(key, java.lang.Double.doubleToRawLongBits(double)) +fun SharedPreferences.Editor.putDouble(key: String, double: Double) + : SharedPreferences.Editor = putLong(key, double.toRawBits()) fun SharedPreferences.getDouble(key: String, default: Double) = - java.lang.Double.longBitsToDouble(getLong(key, java.lang.Double.doubleToRawLongBits(default))) \ No newline at end of file + Double.fromBits(getLong(key, default.toRawBits())) \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt index 1bcb6537..b8f9e3ba 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SatPassAdapter.kt @@ -7,29 +7,33 @@ import android.widget.TextView import androidx.core.os.bundleOf import androidx.navigation.findNavController import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.card.MaterialCardView import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.repo.SatPass import java.text.SimpleDateFormat import java.util.* -class SatPassAdapter(private val satPassList: List) : - RecyclerView.Adapter() { +class SatPassAdapter : RecyclerView.Adapter() { + + private var satPassList = emptyList() + + fun setList(list: List) { + satPassList = list + } override fun getItemCount(): Int { return satPassList.size } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val itemView = - LayoutInflater.from(parent.context).inflate(R.layout.sat_pass_card, parent, false) + val itemView = LayoutInflater + .from(parent.context) + .inflate(R.layout.sat_pass_card, parent, false) return ViewHolder(itemView) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val satPass = satPassList[position] - val layout = holder.itemView.findViewById(R.id.card_view) val satName = holder.itemView.findViewById(R.id.card_sat_name) val maxEl = holder.itemView.findViewById(R.id.card_max_el) val passVector = holder.itemView.findViewById(R.id.card_pass_vector) @@ -47,7 +51,7 @@ class SatPassAdapter(private val satPassList: List) : passStart.text = String.format("AOS - %s", aosTime) passEnd.text = String.format("LOS - %s", losTime) - layout.setOnClickListener { + holder.itemView.setOnClickListener { val bundle = bundleOf("satPass" to satPass) holder.itemView.findNavController().navigate(R.id.action_nav_sky_to_nav_radar, bundle) } diff --git a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt index 714681ba..607b80b7 100644 --- a/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt +++ b/app/src/main/java/com/rtbishop/lookingsat/ui/SkyFragment.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager @@ -17,6 +16,7 @@ import com.github.amsacode.predict4java.TLE import com.google.android.material.floatingactionbutton.FloatingActionButton import com.rtbishop.lookingsat.MainViewModel import com.rtbishop.lookingsat.R +import com.rtbishop.lookingsat.repo.SatPass import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit @@ -27,17 +27,19 @@ class SkyFragment : Fragment() { private lateinit var recViewCurrent: RecyclerView private lateinit var recViewFuture: RecyclerView private lateinit var recAdapterCurrent: RecyclerView.Adapter<*> - private lateinit var recAdapterFuture: RecyclerView.Adapter<*> + private lateinit var recAdapterFuture: SatPassAdapter private lateinit var timeToAos: TextView private lateinit var btnPassPrefs: ImageButton private lateinit var progressBar: ProgressBar private lateinit var fab: FloatingActionButton private lateinit var aosTimer: CountDownTimer + private lateinit var satPassList: List private var isTimerSet: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(activity as MainActivity).get(MainViewModel::class.java) + recAdapterFuture = SatPassAdapter() } override fun onCreateView( @@ -58,12 +60,19 @@ class SkyFragment : Fragment() { recViewFuture = view.findViewById(R.id.sky_recycler_future) fab = view.findViewById(R.id.sky_fab) - recViewFuture.layoutManager = LinearLayoutManager(activity) + satPassList = viewModel.satPassList + recViewFuture.apply { + layoutManager = LinearLayoutManager(activity as MainActivity) + adapter = recAdapterFuture + } + recAdapterFuture.setList(satPassList) + recAdapterFuture.notifyDataSetChanged() + if (satPassList.isEmpty()) { + resetTimer() + } btnPassPrefs.setOnClickListener { showSatPassPrefsDialog() } fab.setOnClickListener { showSelectSatDialog() } - - viewModel.gsp.observe(this, Observer { calculatePasses() }) } private fun showSatPassPrefsDialog() { @@ -138,9 +147,10 @@ class SkyFragment : Fragment() { recViewFuture.visibility = View.INVISIBLE progressBar.visibility = View.VISIBLE progressBar.isIndeterminate = true - val satPassList = viewModel.getPasses() - recAdapterFuture = SatPassAdapter(satPassList) - recViewFuture.adapter = recAdapterFuture + viewModel.getPasses() + satPassList = viewModel.satPassList + recAdapterFuture.setList(satPassList) + recAdapterFuture.notifyDataSetChanged() progressBar.isIndeterminate = false progressBar.visibility = View.INVISIBLE recViewFuture.visibility = View.VISIBLE diff --git a/app/src/main/res/layout/fragment_sky.xml b/app/src/main/res/layout/fragment_sky.xml index 62a2671e..c8676f80 100644 --- a/app/src/main/res/layout/fragment_sky.xml +++ b/app/src/main/res/layout/fragment_sky.xml @@ -29,7 +29,6 @@ android:id="@+id/sky_recycler_future" android:layout_width="0dp" android:layout_height="0dp" - android:visibility="invisible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/sat_pass_pref.xml b/app/src/main/res/layout/sat_pass_pref.xml index b58b34b2..b0034939 100644 --- a/app/src/main/res/layout/sat_pass_pref.xml +++ b/app/src/main/res/layout/sat_pass_pref.xml @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:hint="@string/pass_pref_hint_maxEl" android:importantForAutofill="no" - android:inputType="number" + android:inputType="numberDecimal" app:layout_constraintEnd_toEndOf="@+id/pass_pref_tv_maxEl" app:layout_constraintStart_toStartOf="@+id/pass_pref_tv_maxEl" app:layout_constraintTop_toBottomOf="@+id/pass_pref_tv_maxEl" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 97144b03..93ae1107 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -74,7 +74,7 @@