Switched to using the NavResult Api for tle sources list

This commit is contained in:
Arty Bishop committed 2021-03-18 21:43:30 +00:00
1 parent 0ddd0286a5
commit af7a4d03d2
3 files changed
+43 -5

No files matched your search

@@ -28,9 +28,11 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.model.Result import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.TleSource
import com.rtbishop.look4sat.databinding.FragmentEntriesBinding import com.rtbishop.look4sat.databinding.FragmentEntriesBinding
import com.rtbishop.look4sat.ui.SharedViewModel import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.RecyclerDivider import com.rtbishop.look4sat.utility.RecyclerDivider
import com.rtbishop.look4sat.utility.getNavResult
import com.rtbishop.look4sat.utility.navigateSafe import com.rtbishop.look4sat.utility.navigateSafe
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -54,6 +56,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
binding = FragmentEntriesBinding.bind(view) binding = FragmentEntriesBinding.bind(view)
setupComponents() setupComponents()
setupObservers() setupObservers()
observeSourcesResult()
} }
private fun setupComponents() { private fun setupComponents() {
@@ -104,6 +107,12 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
}) })
} }
private fun observeSourcesResult() {
getNavResult<List<String>>(R.id.nav_entries, "sources") { result ->
viewModel.updateSatDataFromSources(result.map { TleSource(it) })
}
}
private fun setLoaded() { private fun setLoaded() {
binding?.apply { binding?.apply {
entriesError.visibility = View.INVISIBLE entriesError.visibility = View.INVISIBLE
@@ -23,17 +23,19 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.databinding.DialogSourcesBinding import com.rtbishop.look4sat.databinding.DialogSourcesBinding
import com.rtbishop.look4sat.ui.SharedViewModel import com.rtbishop.look4sat.utility.setNavResult
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class SourcesDialog : AppCompatDialogFragment() { class SourcesDialog : AppCompatDialogFragment() {
private val viewModel: SharedViewModel by activityViewModels() @Inject
lateinit var prefsRepo: PrefsRepo
override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? {
return inflater.inflate(R.layout.dialog_sources, group, false) return inflater.inflate(R.layout.dialog_sources, group, false)
@@ -41,7 +43,7 @@ class SourcesDialog : AppCompatDialogFragment() {
override fun onViewCreated(view: View, state: Bundle?) { override fun onViewCreated(view: View, state: Bundle?) {
super.onViewCreated(view, state) super.onViewCreated(view, state)
val sourcesAdapter = SourcesAdapter().apply { setSources(viewModel.getSources()) } val sourcesAdapter = SourcesAdapter().apply { setSources(prefsRepo.loadTleSources()) }
DialogSourcesBinding.bind(view).apply { DialogSourcesBinding.bind(view).apply {
dialog?.window?.setLayout( dialog?.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
@@ -55,7 +57,7 @@ class SourcesDialog : AppCompatDialogFragment() {
sourcesAdapter.addSource() sourcesAdapter.addSource()
} }
tleSourcesBtnPos.setOnClickListener { tleSourcesBtnPos.setOnClickListener {
viewModel.updateSatDataFromSources(sourcesAdapter.getSources()) setNavResult("sources", sourcesAdapter.getSources().map { it.url })
dismiss() dismiss()
} }
tleSourcesBtnNeg.setOnClickListener { dismiss() } tleSourcesBtnNeg.setOnClickListener { dismiss() }
@@ -24,9 +24,13 @@ import android.net.NetworkCapabilities
import android.net.NetworkRequest import android.net.NetworkRequest
import android.os.Bundle import android.os.Bundle
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavOptions import androidx.navigation.NavOptions
import androidx.navigation.Navigator import androidx.navigation.Navigator
import androidx.navigation.fragment.findNavController
import com.github.amsacode.predict4java.GroundStationPosition import com.github.amsacode.predict4java.GroundStationPosition
import com.github.amsacode.predict4java.Satellite import com.github.amsacode.predict4java.Satellite
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -65,6 +69,29 @@ fun NavController.navigateSafe(
} }
} }
fun <T> Fragment.setNavResult(key: String, value: T) {
findNavController().previousBackStackEntry?.savedStateHandle?.set(key, value)
}
fun <T> Fragment.getNavResult(@IdRes id: Int, key: String, onResult: (result: T) -> Unit) {
val navBackStackEntry = findNavController().getBackStackEntry(id)
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME
&& navBackStackEntry.savedStateHandle.contains(key)
) {
val result = navBackStackEntry.savedStateHandle.get<T>(key)
result?.let(onResult)
navBackStackEntry.savedStateHandle.remove<T>(key)
}
}
navBackStackEntry.lifecycle.addObserver(observer)
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
navBackStackEntry.lifecycle.removeObserver(observer)
}
})
}
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
fun Context.isNetworkAvailableFlow(): Flow<Boolean> = callbackFlow { fun Context.isNetworkAvailableFlow(): Flow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() { val callback = object : ConnectivityManager.NetworkCallback() {