Switched to using SafeArgs plugin for data transfer

This commit is contained in:
Arty Bishop committed 2022-02-19 12:07:40 +00:00
1 parent 72f71b2153
commit 8b8c443bd1
8 files changed
+75 -59

No files matched your search

+4 -3
View File
@@ -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"
@@ -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 <T> Fragment.getNavResult(@IdRes id: Int, key: String, onResult: (result: T) -> Unit) {
val backStackEntry = findNavController().getBackStackEntry(id)
val observer = LifecycleEventObserver { _, event ->
@@ -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) }
@@ -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<List<SatPass>>,
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)
}
}
}
@@ -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)
@@ -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<List<String>>(R.id.nav_settings, "sources") { sources ->
+35 -20
View File
@@ -5,39 +5,43 @@
android:id="@+id/nav_root"
app:startDestination="@id/nav_passes">
<fragment
android:id="@+id/nav_satellites"
android:id="@+id/nav_entries"
android:name="com.rtbishop.look4sat.presentation.entriesScreen.EntriesFragment"
tools:layout="@layout/fragment_entries">
</fragment>
tools:layout="@layout/fragment_entries" />
<fragment
android:id="@+id/nav_passes"
android:name="com.rtbishop.look4sat.presentation.passesScreen.PassesFragment"
tools:layout="@layout/fragment_passes">
<action
android:id="@+id/action_passes_to_entries"
app:destination="@id/nav_satellites" />
<action
android:id="@+id/action_passes_to_pass_prefs"
app:destination="@id/nav_pass_prefs" />
<action
android:id="@+id/action_passes_to_prefs"
app:destination="@id/nav_settings" />
<action
android:id="@+id/action_passes_to_radar"
app:destination="@id/nav_radar" />
</fragment>
<dialog
android:id="@+id/nav_pass_prefs"
android:name="com.rtbishop.look4sat.presentation.passesScreen.PassesPrefsDialog"
tools:layout="@layout/dialog_passes" />
<fragment
android:id="@+id/nav_radar"
android:name="com.rtbishop.look4sat.presentation.radarScreen.RadarFragment"
tools:layout="@layout/fragment_radar">
<action
android:id="@+id/action_radar_to_map"
app:destination="@id/nav_map" />
<argument
android:name="catNum"
android:defaultValue="0"
app:argType="integer" />
<argument
android:name="aosTime"
android:defaultValue="0L"
app:argType="long" />
</fragment>
<fragment
android:id="@+id/nav_map"
android:name="com.rtbishop.look4sat.presentation.mapScreen.MapFragment"
tools:layout="@layout/fragment_map" />
tools:layout="@layout/fragment_map">
<argument
android:name="catNum"
android:defaultValue="0"
app:argType="integer" />
</fragment>
<fragment
android:id="@+id/nav_settings"
android:name="com.rtbishop.look4sat.presentation.settingsScreen.SettingsFragment"
@@ -46,12 +50,23 @@
android:id="@+id/action_prefs_to_sources"
app:destination="@id/nav_sources" />
</fragment>
<dialog
android:id="@+id/nav_pass_prefs"
android:name="com.rtbishop.look4sat.presentation.passesScreen.PassesPrefsDialog"
tools:layout="@layout/dialog_passes" />
<dialog
android:id="@+id/nav_sources"
android:name="com.rtbishop.look4sat.presentation.sourcesScreen.SourcesDialog"
tools:layout="@layout/dialog_sources" />
<action
android:id="@+id/action_global_entriesFragment"
app:destination="@id/nav_entries" />
<action
android:id="@+id/action_global_passesFragment"
app:destination="@id/nav_passes" />
<action
android:id="@+id/action_global_radarFragment"
app:destination="@id/nav_radar" />
<action
android:id="@+id/action_global_mapFragment"
app:destination="@id/nav_map" />
<action
android:id="@+id/action_global_settingsFragment"
app:destination="@id/nav_settings" />
</navigation>
+1
View File
@@ -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"
}
}