diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt index a9a9a81c..4b516582 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt @@ -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>(R.id.nav_entries, "sources") { result -> + viewModel.updateSatDataFromSources(result.map { TleSource(it) }) + } + } + private fun setLoaded() { binding?.apply { entriesError.visibility = View.INVISIBLE diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt index f87c39c0..7580db9b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt @@ -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() } diff --git a/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt b/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt index d68bf90a..4bbdbaf6 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt +++ b/app/src/main/java/com/rtbishop/look4sat/utility/Extensions.kt @@ -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 Fragment.setNavResult(key: String, value: T) { + findNavController().previousBackStackEntry?.savedStateHandle?.set(key, value) +} + +fun 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(key) + result?.let(onResult) + navBackStackEntry.savedStateHandle.remove(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 = callbackFlow { val callback = object : ConnectivityManager.NetworkCallback() {