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.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.TleSource
import com.rtbishop.look4sat.databinding.FragmentEntriesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.RecyclerDivider
import com.rtbishop.look4sat.utility.getNavResult
import com.rtbishop.look4sat.utility.navigateSafe
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -54,6 +56,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
binding = FragmentEntriesBinding.bind(view)
setupComponents()
setupObservers()
observeSourcesResult()
}
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() {
binding?.apply {
entriesError.visibility = View.INVISIBLE
@@ -23,17 +23,19 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.databinding.DialogSourcesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.setNavResult
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class SourcesDialog : AppCompatDialogFragment() {
private val viewModel: SharedViewModel by activityViewModels()
@Inject
lateinit var prefsRepo: PrefsRepo
override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? {
return inflater.inflate(R.layout.dialog_sources, group, false)
@@ -41,7 +43,7 @@ class SourcesDialog : AppCompatDialogFragment() {
override fun onViewCreated(view: View, state: Bundle?) {
super.onViewCreated(view, state)
val sourcesAdapter = SourcesAdapter().apply { setSources(viewModel.getSources()) }
val sourcesAdapter = SourcesAdapter().apply { setSources(prefsRepo.loadTleSources()) }
DialogSourcesBinding.bind(view).apply {
dialog?.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
@@ -55,7 +57,7 @@ class SourcesDialog : AppCompatDialogFragment() {
sourcesAdapter.addSource()
}
tleSourcesBtnPos.setOnClickListener {
viewModel.updateSatDataFromSources(sourcesAdapter.getSources())
setNavResult("sources", sourcesAdapter.getSources().map { it.url })
dismiss()
}
tleSourcesBtnNeg.setOnClickListener { dismiss() }
@@ -24,9 +24,13 @@ import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.findNavController
import com.github.amsacode.predict4java.GroundStationPosition
import com.github.amsacode.predict4java.Satellite
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
fun Context.isNetworkAvailableFlow(): Flow<Boolean> = callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {