diff --git a/app/build.gradle b/app/build.gradle index c87b2597..3473edfb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ plugins { id "org.jetbrains.kotlin.android" id "org.jetbrains.kotlin.kapt" id "dagger.hilt.android.plugin" + id "androidx.navigation.safeargs.kotlin" } android { @@ -61,9 +62,9 @@ dependencies { implementation "com.google.android.material:material:1.5.0" implementation "androidx.constraintlayout:constraintlayout:2.1.3" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0" - implementation "androidx.navigation:navigation-fragment-ktx:2.4.0" - implementation "androidx.navigation:navigation-ui-ktx:2.4.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.1" + implementation "androidx.navigation:navigation-fragment-ktx:2.4.1" + implementation "androidx.navigation:navigation-ui-ktx:2.4.1" implementation "androidx.room:room-runtime:2.4.1" implementation "androidx.room:room-ktx:2.4.1" kapt "androidx.room:room-compiler:2.4.1" diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/Extensions.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/Extensions.kt index eba7f440..879cab64 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/Extensions.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/Extensions.kt @@ -20,7 +20,6 @@ package com.rtbishop.look4sat.presentation import android.content.Context import android.content.SharedPreferences import android.content.res.Resources -import android.os.Bundle import android.widget.EditText import android.widget.FrameLayout import android.widget.Toast @@ -29,9 +28,6 @@ import androidx.appcompat.app.AlertDialog 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 java.net.InetSocketAddress import java.net.Socket @@ -51,18 +47,6 @@ fun SharedPreferences.Editor.putDouble(key: String, double: Double) { putLong(key, double.toRawBits()) } -fun NavController.navigateSafe( - @IdRes resId: Int, - args: Bundle? = null, - options: NavOptions? = null, - extras: Navigator.Extras? = null -) { - val action = currentDestination?.getAction(resId) ?: graph.getAction(resId) - if (action != null && currentDestination?.id != action.destinationId) { - navigate(resId, args, options, extras) - } -} - fun Fragment.getNavResult(@IdRes id: Int, key: String, onResult: (result: T) -> Unit) { val backStackEntry = findNavController().getBackStackEntry(id) val observer = LifecycleEventObserver { _, event -> diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt index b71d0b04..584e82c6 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt @@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentMapBinding import com.rtbishop.look4sat.domain.predict.GeoPos @@ -50,6 +51,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { @Inject lateinit var sharedPreferences: SharedPreferences + private val args: MapFragmentArgs by navArgs() private val viewModel: MapViewModel by viewModels() private val minLat = MapView.getTileSystem().minLatitude private val maxLat = MapView.getTileSystem().maxLatitude @@ -91,7 +93,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { } private fun setupObservers(binding: FragmentMapBinding) { - viewModel.selectDefaultSatellite(arguments?.getInt("catNum")) + viewModel.selectDefaultSatellite(args.catNum) viewModel.stationPosLiveData.observe(viewLifecycleOwner) { renderStationPos(it, binding) } viewModel.satPositions.observe(viewLifecycleOwner) { renderSatPositions(it, binding) } viewModel.satTrack.observe(viewLifecycleOwner) { renderSatTrack(it, binding) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt index c9dde0e9..9e716706 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt @@ -20,7 +20,6 @@ package com.rtbishop.look4sat.presentation.passesScreen import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -33,7 +32,6 @@ import com.rtbishop.look4sat.databinding.FragmentPassesBinding import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.SatPass import com.rtbishop.look4sat.presentation.getNavResult -import com.rtbishop.look4sat.presentation.navigateSafe import com.rtbishop.look4sat.presentation.toTimerString import dagger.hilt.android.AndroidEntryPoint @@ -71,9 +69,8 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC setProgressBackgroundColorSchemeResource(R.color.themeAccent) setOnRefreshListener { passesViewModel.forceCalculation() } } - passesFilter.setOnClickListener { findNavController().navigate(R.id.nav_pass_prefs) } - passesSettings.setOnClickListener { findNavController().navigate(R.id.nav_settings) } -// passesFab.setOnClickListener { findNavController().navigate(R.id.nav_satellites) } + passesFilter.setOnClickListener { navigateToPassPrefs() } + passesSettings.setOnClickListener { navigateToSettings() } } passesViewModel.passes.observe(viewLifecycleOwner) { passesResult -> handleNewPasses(passesResult, adapter, binding) @@ -85,7 +82,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC Toast.makeText(requireContext(), "Nothing to show", Toast.LENGTH_SHORT).show() } } else { - binding.passesFab.setOnClickListener { findNavController().navigate(R.id.nav_satellites) } + binding.passesFab.setOnClickListener { findNavController().navigate(R.id.nav_entries) } } } } @@ -95,6 +92,16 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC } } + private fun navigateToPassPrefs() { + val direction = PassesFragmentDirections.actionPassesToPassPrefs() + findNavController().navigate(direction) + } + + private fun navigateToSettings() { + val direction = PassesFragmentDirections.actionGlobalSettingsFragment() + findNavController().navigate(direction) + } + private fun handleNewPasses( dataState: DataState>, passesAdapter: PassesAdapter, @@ -148,8 +155,10 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC override fun navigateToPass(satPass: SatPass) { if (satPass.progress < 100) { - val bundle = bundleOf("catNum" to satPass.catNum, "aosTime" to satPass.aosTime) - findNavController().navigateSafe(R.id.action_passes_to_radar, bundle) + val catNum = satPass.catNum + val aosTime = satPass.aosTime + val action = PassesFragmentDirections.actionGlobalRadarFragment(catNum, aosTime) + findNavController().navigate(action) } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt index 1ec80d9e..98dc7fb5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt @@ -19,10 +19,10 @@ package com.rtbishop.look4sat.presentation.radarScreen import android.os.Bundle import android.view.View -import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.SimpleItemAnimator @@ -31,7 +31,6 @@ import com.rtbishop.look4sat.data.ISettingsHandler import com.rtbishop.look4sat.databinding.FragmentRadarBinding import com.rtbishop.look4sat.domain.predict.SatPass import com.rtbishop.look4sat.domain.predict.SatPos -import com.rtbishop.look4sat.presentation.navigateSafe import com.rtbishop.look4sat.presentation.toTimerString import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -41,6 +40,7 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { @Inject lateinit var preferences: ISettingsHandler + private val args: RadarFragmentArgs by navArgs() private val viewModel: RadarViewModel by viewModels() private var radarView: RadarView? = null @@ -70,9 +70,7 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { transmittersAdapter: TransmittersAdapter, binding: FragmentRadarBinding ) { - val catNum = requireArguments().getInt("catNum") - val aosTime = requireArguments().getLong("aosTime") - viewModel.getPass(catNum, aosTime).observe(viewLifecycleOwner) { pass -> + viewModel.getPass(args.catNum, args.aosTime).observe(viewLifecycleOwner) { pass -> radarView = RadarView(requireContext()).apply { setShowAim(preferences.getUseCompass()) setScanning(preferences.getShowSweep()) @@ -99,13 +97,15 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { orientation.third ) } - binding.radarMap.setOnClickListener { - val bundle = bundleOf("catNum" to pass.catNum) - findNavController().navigateSafe(R.id.action_radar_to_map, bundle) - } + binding.radarMap.setOnClickListener { navigateToMap(pass.catNum) } } } + private fun navigateToMap(catnum: Int) { + val direction = RadarFragmentDirections.actionGlobalMapFragment(catnum) + findNavController().navigate(direction) + } + private fun setPassText(satPass: SatPass, satPos: SatPos, binding: FragmentRadarBinding) { val timeNow = System.currentTimeMillis() val polarAz = getString(R.string.pat_azimuth) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt index 206f5290..a6816b70 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt @@ -37,7 +37,10 @@ import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentSettingsBinding import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.GeoPos -import com.rtbishop.look4sat.presentation.* +import com.rtbishop.look4sat.presentation.getNavResult +import com.rtbishop.look4sat.presentation.isValidIPv4 +import com.rtbishop.look4sat.presentation.isValidPort +import com.rtbishop.look4sat.presentation.setEditText import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -114,7 +117,8 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { private fun setupDataCard(binding: FragmentSettingsBinding) { binding.prefsData.updateBtnFile.setOnClickListener { contentRequest.launch("*/*") } binding.prefsData.updateBtnWeb.setOnClickListener { - findNavController().navigateSafe(R.id.action_prefs_to_sources) + val action = SettingsFragmentDirections.actionPrefsToSources() + findNavController().navigate(action) } binding.prefsData.updateBtnClear.setOnClickListener { viewModel.clearData() } getNavResult>(R.id.nav_settings, "sources") { sources -> diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 31fca570..5ac2aa9a 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -5,39 +5,43 @@ android:id="@+id/nav_root" app:startDestination="@id/nav_passes"> - + tools:layout="@layout/fragment_entries" /> - - - + - + + + tools:layout="@layout/fragment_map"> + + - + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9c36fb5e..eeed7ba0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ buildscript { dependencies { classpath "com.google.dagger:hilt-android-gradle-plugin:2.40.5" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1" } }