mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Further code cleanup, injected PrefsManager, libs update
This commit is contained in:
1 parent
1d753ba81f
commit
75374ca4d9
8 files changed
+84
-89
No files matched your search
+4
-3
@@ -24,14 +24,15 @@ apply plugin: 'kotlin-kapt'
|
||||
apply plugin: "androidx.navigation.safeargs.kotlin"
|
||||
|
||||
android {
|
||||
compileSdkVersion 29
|
||||
buildToolsVersion "29.0.3"
|
||||
compileSdkVersion 30
|
||||
buildToolsVersion "30.0.2"
|
||||
defaultConfig {
|
||||
applicationId "com.rtbishop.look4sat"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 29
|
||||
targetSdkVersion 30
|
||||
versionCode 18
|
||||
versionName '1.4.8'
|
||||
resConfigs "en", "ru"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
|
||||
@@ -22,7 +22,10 @@ package com.rtbishop.look4sat.ui
|
||||
import android.net.Uri
|
||||
import androidx.lifecycle.*
|
||||
import com.github.amsacode.predict4java.GroundStationPosition
|
||||
import com.rtbishop.look4sat.data.*
|
||||
import com.rtbishop.look4sat.data.Result
|
||||
import com.rtbishop.look4sat.data.SatEntry
|
||||
import com.rtbishop.look4sat.data.SatPass
|
||||
import com.rtbishop.look4sat.data.TleSource
|
||||
import com.rtbishop.look4sat.repo.Repository
|
||||
import com.rtbishop.look4sat.utility.PassPredictor
|
||||
import com.rtbishop.look4sat.utility.PrefsManager
|
||||
@@ -39,6 +42,7 @@ class SharedViewModel @Inject constructor(
|
||||
) : ViewModel() {
|
||||
|
||||
private val _passes = MutableLiveData<Result<MutableList<SatPass>>>()
|
||||
private var selectedEntries = emptyList<SatEntry>()
|
||||
|
||||
init {
|
||||
if (prefsManager.isFirstLaunch()) {
|
||||
@@ -46,35 +50,15 @@ class SharedViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun setSelectedEntries(entries: List<SatEntry>) {
|
||||
selectedEntries = entries.filter { it.isSelected }
|
||||
}
|
||||
|
||||
fun getSources() = repository.getSources()
|
||||
fun getEntries() = repository.getEntries()
|
||||
fun getPasses(): LiveData<Result<MutableList<SatPass>>> = _passes
|
||||
fun getTransmittersForSat(id: Int) = liveData { emit(repository.getTransmittersForSatId(id)) }
|
||||
|
||||
fun getPassPrefs(): PassPrefs {
|
||||
return prefsManager.getPassPrefs()
|
||||
}
|
||||
|
||||
fun setPassPrefs(hoursAhead: Int, minEl: Double) {
|
||||
prefsManager.setPassPrefs(hoursAhead, minEl)
|
||||
}
|
||||
|
||||
fun getStationPosition(): GroundStationPosition {
|
||||
return prefsManager.getStationPosition()
|
||||
}
|
||||
|
||||
fun setStationPositionFromGPS() {
|
||||
prefsManager.setStationPositionFromGPS()
|
||||
}
|
||||
|
||||
fun shouldUseUTC(): Boolean {
|
||||
return prefsManager.shouldUseUTC()
|
||||
}
|
||||
|
||||
fun shouldUseCompass(): Boolean {
|
||||
return prefsManager.shouldUseCompass()
|
||||
}
|
||||
|
||||
fun updateEntriesFromFile(uri: Uri) {
|
||||
viewModelScope.launch {
|
||||
repository.updateEntriesFromFile(uri)
|
||||
@@ -89,31 +73,35 @@ class SharedViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun updateEntriesSelection(satIds: MutableList<Int>) {
|
||||
fun updateEntriesSelection(entries: List<SatEntry>) {
|
||||
viewModelScope.launch {
|
||||
repository.updateEntriesSelection(satIds)
|
||||
selectedEntries = entries.filter { it.isSelected }
|
||||
calculatePasses()
|
||||
repository.updateEntriesSelection(selectedEntries.map { it.catNum })
|
||||
}
|
||||
}
|
||||
|
||||
fun calculatePassesForEntries(entries: List<SatEntry>) {
|
||||
fun calculatePasses(dateNow: Date = Date(System.currentTimeMillis())) {
|
||||
_passes.value = Result.InProgress
|
||||
val dateNow = Date(System.currentTimeMillis())
|
||||
val passes = mutableListOf<SatPass>()
|
||||
viewModelScope.launch(Dispatchers.Default) {
|
||||
entries.forEach {
|
||||
passes.addAll(getPassesForEntries(it, dateNow, getStationPosition()))
|
||||
val passes = mutableListOf<SatPass>()
|
||||
selectedEntries.forEach {
|
||||
passes.addAll(getPassesForEntries(it, dateNow, prefsManager.getStationPosition()))
|
||||
}
|
||||
val filteredPasses = filterAndSortPasses(passes, dateNow, getPassPrefs().hoursAhead)
|
||||
val filteredPasses =
|
||||
filterAndSortPasses(passes, dateNow, prefsManager.getPassPrefs().hoursAhead)
|
||||
_passes.postValue(Result.Success(filteredPasses))
|
||||
}
|
||||
}
|
||||
|
||||
private fun setDefaultTleSources() {
|
||||
val defaultTleSources = listOf(
|
||||
TleSource("https://celestrak.com/NORAD/elements/active.txt"),
|
||||
TleSource("https://amsat.org/tle/current/nasabare.txt")
|
||||
)
|
||||
viewModelScope.launch { repository.updateSources(defaultTleSources) }
|
||||
viewModelScope.launch {
|
||||
val defaultTleSources = listOf(
|
||||
TleSource("https://celestrak.com/NORAD/elements/active.txt"),
|
||||
TleSource("https://amsat.org/tle/current/nasabare.txt")
|
||||
)
|
||||
repository.updateSources(defaultTleSources)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getPassesForEntries(
|
||||
|
||||
@@ -6,7 +6,7 @@ import android.view.View
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.navigation.findNavController
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -26,7 +26,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
|
||||
lateinit var factory: ViewModelFactory
|
||||
|
||||
private lateinit var binding: FragmentEntriesBinding
|
||||
private lateinit var viewModel: SharedViewModel
|
||||
private val viewModel: SharedViewModel by activityViewModels { factory }
|
||||
private val pickFileReqCode = 100
|
||||
private val entriesAdapter = EntriesAdapter()
|
||||
private var tleSources = listOf<TleSource>()
|
||||
@@ -35,7 +35,6 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
binding = FragmentEntriesBinding.bind(view)
|
||||
(requireActivity().application as Look4SatApp).appComponent.inject(this)
|
||||
viewModel = ViewModelProvider(requireActivity(), factory).get(SharedViewModel::class.java)
|
||||
setupComponents()
|
||||
setupObservers()
|
||||
}
|
||||
@@ -51,6 +50,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
|
||||
layoutManager = linearLayoutMgr
|
||||
adapter = entriesAdapter
|
||||
addItemDecoration(divider)
|
||||
setHasFixedSize(true)
|
||||
}
|
||||
importWeb.setOnClickListener { showImportFromWebDialog() }
|
||||
importFile.setOnClickListener { showImportFromFileDialog() }
|
||||
@@ -64,6 +64,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
|
||||
private fun setupObservers() {
|
||||
viewModel.getSources().observe(viewLifecycleOwner, { tleSources = it })
|
||||
viewModel.getEntries().observe(viewLifecycleOwner, {
|
||||
viewModel.setSelectedEntries(it)
|
||||
entriesAdapter.setEntries(it as MutableList<SatEntry>)
|
||||
})
|
||||
}
|
||||
@@ -81,9 +82,8 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
|
||||
}
|
||||
|
||||
private fun navigateToPasses() {
|
||||
val catNumList = mutableListOf<Int>()
|
||||
entriesAdapter.getEntries().forEach { if (it.isSelected) catNumList.add(it.catNum) }
|
||||
viewModel.updateEntriesSelection(catNumList)
|
||||
binding.searchBar.clearFocus()
|
||||
viewModel.updateEntriesSelection(entriesAdapter.getEntries())
|
||||
requireView().findNavController().navigate(R.id.action_entries_to_passes)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.github.amsacode.predict4java.GroundStationPosition
|
||||
@@ -22,6 +22,7 @@ import com.rtbishop.look4sat.data.SatItem
|
||||
import com.rtbishop.look4sat.data.SatPass
|
||||
import com.rtbishop.look4sat.databinding.FragmentMapBinding
|
||||
import com.rtbishop.look4sat.ui.SharedViewModel
|
||||
import com.rtbishop.look4sat.utility.PrefsManager
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -42,22 +43,24 @@ import kotlin.math.sqrt
|
||||
class MapFragment : Fragment(R.layout.fragment_map) {
|
||||
|
||||
@Inject
|
||||
lateinit var modelFactory: ViewModelFactory
|
||||
lateinit var factory: ViewModelFactory
|
||||
|
||||
@Inject
|
||||
lateinit var prefsManager: PrefsManager
|
||||
|
||||
private lateinit var mainActivity: FragmentActivity
|
||||
private lateinit var viewModel: SharedViewModel
|
||||
private lateinit var binding: FragmentMapBinding
|
||||
private lateinit var trackPaint: Paint
|
||||
private lateinit var footprintPaint: Paint
|
||||
private lateinit var selectedPass: SatPass
|
||||
private val dateNow = Date(System.currentTimeMillis())
|
||||
private val viewModel: SharedViewModel by activityViewModels { factory }
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
binding = FragmentMapBinding.bind(view)
|
||||
mainActivity = requireActivity()
|
||||
(mainActivity.application as Look4SatApp).appComponent.inject(this)
|
||||
viewModel = ViewModelProvider(mainActivity, modelFactory).get(SharedViewModel::class.java)
|
||||
|
||||
val prefs = PreferenceManager.getDefaultSharedPreferences(mainActivity.applicationContext)
|
||||
Configuration.getInstance().load(mainActivity.applicationContext, prefs)
|
||||
@@ -78,7 +81,7 @@ class MapFragment : Fragment(R.layout.fragment_map) {
|
||||
}
|
||||
|
||||
setupMapView()
|
||||
setupPosOverlay(viewModel.getStationPosition())
|
||||
setupPosOverlay(prefsManager.getStationPosition())
|
||||
setupObservers()
|
||||
}
|
||||
|
||||
|
||||
@@ -19,25 +19,27 @@
|
||||
|
||||
package com.rtbishop.look4sat.ui.fragments
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.os.Bundle
|
||||
import android.os.CountDownTimer
|
||||
import android.view.View
|
||||
import android.widget.EditText
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||
import com.rtbishop.look4sat.Look4SatApp
|
||||
import com.rtbishop.look4sat.R
|
||||
import com.rtbishop.look4sat.dagger.ViewModelFactory
|
||||
import com.rtbishop.look4sat.data.Result
|
||||
import com.rtbishop.look4sat.data.SatEntry
|
||||
import com.rtbishop.look4sat.data.SatPass
|
||||
import com.rtbishop.look4sat.databinding.FragmentPassesBinding
|
||||
import com.rtbishop.look4sat.ui.SharedViewModel
|
||||
import com.rtbishop.look4sat.ui.adapters.PassesAdapter
|
||||
import com.rtbishop.look4sat.utility.PrefsManager
|
||||
import com.rtbishop.look4sat.utility.Utilities
|
||||
import com.rtbishop.look4sat.utility.Utilities.getRotationAnimator
|
||||
import com.rtbishop.look4sat.utility.Utilities.snack
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
@@ -47,44 +49,35 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
||||
@Inject
|
||||
lateinit var factory: ViewModelFactory
|
||||
|
||||
private lateinit var viewModel: SharedViewModel
|
||||
@Inject
|
||||
lateinit var prefsManager: PrefsManager
|
||||
|
||||
private lateinit var aosTimer: CountDownTimer
|
||||
private lateinit var binding: FragmentPassesBinding
|
||||
private var isTimerSet: Boolean = false
|
||||
private lateinit var animator: ObjectAnimator
|
||||
private val viewModel: SharedViewModel by activityViewModels { factory }
|
||||
private val passesAdapter = PassesAdapter()
|
||||
private var selectedEntries = listOf<SatEntry>()
|
||||
private var isTimerSet: Boolean = false
|
||||
private var passes = mutableListOf<SatPass>()
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
binding = FragmentPassesBinding.bind(view)
|
||||
(requireActivity().application as Look4SatApp).appComponent.inject(this)
|
||||
viewModel = ViewModelProvider(requireActivity(), factory).get(SharedViewModel::class.java)
|
||||
setupObservers()
|
||||
setupComponents()
|
||||
setupObservers()
|
||||
}
|
||||
|
||||
// override fun onStart() {
|
||||
// super.onStart()
|
||||
// if (selectedEntries.isEmpty()) {
|
||||
// viewModel.calculatePassesForEntries(selectedEntries)
|
||||
// }
|
||||
// }
|
||||
|
||||
private fun setupObservers() {
|
||||
viewModel.getEntries().observe(viewLifecycleOwner, { allEntries ->
|
||||
selectedEntries = allEntries.filter { it.isSelected }
|
||||
// viewModel.calculatePassesForEntries(selectedEntries)
|
||||
})
|
||||
viewModel.getPasses().observe(viewLifecycleOwner, { result ->
|
||||
when (result) {
|
||||
is Result.Success -> {
|
||||
animator.cancel()
|
||||
passes = result.data
|
||||
passesAdapter.setList(passes)
|
||||
setTimerForPasses(passes)
|
||||
}
|
||||
is Result.InProgress -> {
|
||||
}
|
||||
is Result.InProgress -> animator.start()
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -96,15 +89,22 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
||||
adapter = passesAdapter
|
||||
isVerticalScrollBarEnabled = false
|
||||
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
||||
setHasFixedSize(true)
|
||||
}
|
||||
passesFilter.setOnClickListener {
|
||||
val passPrefs = viewModel.getPassPrefs()
|
||||
val passPrefs = prefsManager.getPassPrefs()
|
||||
showSatPassPrefsDialog(passPrefs.hoursAhead, passPrefs.minEl)
|
||||
}
|
||||
passesFab.setOnClickListener { viewModel.calculatePassesForEntries(selectedEntries) }
|
||||
animator = passesFab.getRotationAnimator()
|
||||
passesFab.setOnClickListener {
|
||||
if (animator.isRunning) {
|
||||
animator.cancel()
|
||||
} else {
|
||||
viewModel.calculatePasses()
|
||||
}
|
||||
}
|
||||
}
|
||||
passesAdapter.setShouldUseUTC(viewModel.shouldUseUTC())
|
||||
passesAdapter.setList(passes)
|
||||
passesAdapter.setShouldUseUTC(prefsManager.shouldUseUTC())
|
||||
setTimerForPasses(passes)
|
||||
}
|
||||
|
||||
@@ -130,8 +130,8 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
||||
getString(R.string.pref_min_el_input_error).snack(requireView())
|
||||
}
|
||||
else -> {
|
||||
viewModel.setPassPrefs(hours, elevation)
|
||||
viewModel.calculatePassesForEntries(selectedEntries)
|
||||
prefsManager.setPassPrefs(hours, elevation)
|
||||
viewModel.calculatePasses()
|
||||
}
|
||||
}
|
||||
} else getString(R.string.err_enter_value).snack(requireView())
|
||||
@@ -183,7 +183,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes) {
|
||||
val millisBeforeEnd = lastPass.pass.endTime.time.minus(timeNow.time)
|
||||
aosTimer = object : CountDownTimer(millisBeforeEnd, 1000) {
|
||||
override fun onFinish() {
|
||||
viewModel.calculatePassesForEntries(selectedEntries)
|
||||
viewModel.calculatePasses()
|
||||
}
|
||||
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
|
||||
@@ -25,7 +25,7 @@ import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.navigation.fragment.navArgs
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -38,6 +38,7 @@ import com.rtbishop.look4sat.databinding.FragmentPolarBinding
|
||||
import com.rtbishop.look4sat.ui.SharedViewModel
|
||||
import com.rtbishop.look4sat.ui.adapters.TransAdapter
|
||||
import com.rtbishop.look4sat.ui.views.PolarView
|
||||
import com.rtbishop.look4sat.utility.PrefsManager
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.*
|
||||
@@ -47,24 +48,26 @@ import kotlin.math.round
|
||||
class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
|
||||
|
||||
@Inject
|
||||
lateinit var modelFactory: ViewModelFactory
|
||||
lateinit var factory: ViewModelFactory
|
||||
|
||||
@Inject
|
||||
lateinit var prefsManager: PrefsManager
|
||||
|
||||
private lateinit var mainActivity: FragmentActivity
|
||||
private lateinit var viewModel: SharedViewModel
|
||||
private lateinit var binding: FragmentPolarBinding
|
||||
private lateinit var satPass: SatPass
|
||||
private lateinit var sensorManager: SensorManager
|
||||
private var polarView: PolarView? = null
|
||||
private val viewModel: SharedViewModel by activityViewModels { factory }
|
||||
private val args: PolarFragmentArgs by navArgs()
|
||||
private val transmitterAdapter = TransAdapter()
|
||||
private var magneticDeclination = 0f
|
||||
private var polarView: PolarView? = null
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
mainActivity = requireActivity()
|
||||
binding = FragmentPolarBinding.bind(view)
|
||||
(mainActivity.application as Look4SatApp).appComponent.inject(this)
|
||||
viewModel = ViewModelProvider(mainActivity, modelFactory).get(SharedViewModel::class.java)
|
||||
sensorManager = mainActivity.getSystemService(Context.SENSOR_SERVICE) as SensorManager
|
||||
binding.recycler.apply {
|
||||
layoutManager = LinearLayoutManager(mainActivity)
|
||||
@@ -76,7 +79,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (viewModel.shouldUseCompass()) {
|
||||
if (prefsManager.shouldUseCompass()) {
|
||||
sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR).also { sensor ->
|
||||
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL)
|
||||
}
|
||||
@@ -85,7 +88,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
if (viewModel.shouldUseCompass()) {
|
||||
if (prefsManager.shouldUseCompass()) {
|
||||
sensorManager.unregisterListener(this)
|
||||
}
|
||||
}
|
||||
@@ -134,7 +137,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
|
||||
}
|
||||
|
||||
private fun calculateMagneticDeclination() {
|
||||
val position = viewModel.getStationPosition()
|
||||
val position = prefsManager.getStationPosition()
|
||||
val geoField = GeomagneticField(
|
||||
position.latitude.toFloat(),
|
||||
position.longitude.toFloat(),
|
||||
|
||||
@@ -30,7 +30,7 @@ object Utilities {
|
||||
|
||||
fun View.getRotationAnimator(): ObjectAnimator {
|
||||
return ObjectAnimator.ofFloat(this, "rotation", 0f, 360f).apply {
|
||||
duration = 800
|
||||
duration = 333
|
||||
repeatCount = ObjectAnimator.INFINITE
|
||||
repeatMode = ObjectAnimator.RESTART
|
||||
interpolator = LinearInterpolator()
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ buildscript {
|
||||
gradle_plugin_version = '1.4.10'
|
||||
material_version = '1.2.1'
|
||||
constraint_layout_version = '2.0.1'
|
||||
ktx_version = '1.3.1'
|
||||
ktx_version = '1.3.2'
|
||||
preference_version = '1.1.1'
|
||||
navigation_version = '2.3.0'
|
||||
lifecycle_version = '2.2.0'
|
||||
|
||||
Reference in new issue
Block a user