From ad732bda794e20a13e65be70460929d3968d7ab4 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Thu, 23 Apr 2020 20:59:32 +0100 Subject: [PATCH] v1.4.0 - Refactoring and code cleanup --- app/build.gradle | 4 +- .../look4sat/persistence/LocalDataSource.kt | 5 +- .../look4sat/persistence/LocalSource.kt | 2 +- .../look4sat/persistence/dao/EntriesDao.kt | 12 ++- .../look4sat/repo/DefaultRepository.kt | 4 +- .../com/rtbishop/look4sat/repo/Repository.kt | 2 +- .../com/rtbishop/look4sat/ui/MainActivity.kt | 5 +- .../rtbishop/look4sat/ui/SharedViewModel.kt | 73 ++++++++++--------- .../look4sat/ui/fragments/PassListFragment.kt | 21 ++++-- .../ui/fragments/PolarViewFragment.kt | 3 +- .../ui/fragments/SatEntryDialogFragment.kt | 7 +- 11 files changed, 81 insertions(+), 57 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b92c851f..c05acdfd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,8 +30,8 @@ android { applicationId "com.rtbishop.look4sat" minSdkVersion 21 targetSdkVersion 29 - versionCode 11 - versionName '1.3.4' + versionCode 12 + versionName '1.4.0' } buildTypes { release { diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt index 2752f6ba..48cbf2ef 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalDataSource.kt @@ -42,8 +42,9 @@ class LocalDataSource @Inject constructor( return entriesDao.getSelectedEntries() } - override suspend fun updateEntriesSelection(entries: List) { - entriesDao.updateEntriesSelection(entries) + override suspend fun updateEntriesSelection(catNumList: List) { + entriesDao.clearEntriesSelection() + catNumList.forEach { entriesDao.updateEntrySelection(it) } } //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt index f87a190e..9cb08e20 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/persistence/LocalSource.kt @@ -11,7 +11,7 @@ interface LocalSource { suspend fun getSelectedEntries(): List - suspend fun updateEntriesSelection(entries: List) + suspend fun updateEntriesSelection(catNumList: List) //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt b/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt index b660dc81..1c63b023 100644 --- a/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/persistence/dao/EntriesDao.kt @@ -19,7 +19,10 @@ package com.rtbishop.look4sat.persistence.dao -import androidx.room.* +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query import com.rtbishop.look4sat.data.SatEntry @Dao @@ -34,6 +37,9 @@ interface EntriesDao { @Query("SELECT * FROM entries WHERE isSelected = 1 ORDER BY name ASC") suspend fun getSelectedEntries(): List - @Update - suspend fun updateEntriesSelection(entries: List) + @Query("UPDATE entries SET isSelected = 1 WHERE catNum == :catNum") + suspend fun updateEntrySelection(catNum: Int) + + @Query("UPDATE entries SET isSelected = 0") + suspend fun clearEntriesSelection() } diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt index 1d31e415..67e0a6c7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/DefaultRepository.kt @@ -58,8 +58,8 @@ class DefaultRepository @Inject constructor( return localSource.getSelectedEntries() } - override suspend fun updateEntriesSelection(entries: List) { - localSource.updateEntriesSelection(entries) + override suspend fun updateEntriesSelection(catNumList: List) { + localSource.updateEntriesSelection(catNumList) } //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt index b9e7a01c..bc08bb37 100644 --- a/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt +++ b/app/src/main/java/com/rtbishop/look4sat/repo/Repository.kt @@ -11,7 +11,7 @@ interface Repository { suspend fun getSelectedEntries(): List - suspend fun updateEntriesSelection(entries: List) + suspend fun updateEntriesSelection(catNumList: List) //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt index 16676f80..6ce5dea3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt @@ -88,7 +88,7 @@ class MainActivity : AppCompatActivity() { setSupportActionBar(toolbar) appBarConfig = AppBarConfiguration( - setOf(R.id.nav_pass_list, R.id.nav_map_view, R.id.nav_settings, R.id.nav_about), + setOf(R.id.nav_pass_list, R.id.nav_map_view), mainBinding.drawerLayout ) @@ -122,6 +122,9 @@ class MainActivity : AppCompatActivity() { drawerBinding.drawerLonValue.text = String.format(getString(R.string.pat_location), gsp.longitude) }) + viewModel.getDebugMessage().observe(this, Observer { message -> + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + }) } private fun setupDrawer() { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt index 202a7499..c2b2ee82 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt @@ -39,56 +39,63 @@ class SharedViewModel @Inject constructor( private val repository: Repository ) : ViewModel() { - var isFirstLaunch = true - private var calculationJob: Job? = null private val urlList = listOf("https://celestrak.com/NORAD/elements/active.txt") - - private val _satPassList = MutableLiveData>() - fun getSatPassList(): LiveData> = _satPassList - private val _gsp = MutableLiveData(prefsManager.getPosition()) - fun getGSP(): LiveData = _gsp - + private val _satPassList = MutableLiveData>() private val _isListRefreshing = MutableLiveData() - fun getRefreshing(): LiveData = _isListRefreshing + private val _debugMessage = MutableLiveData() + private var calculationJob: Job? = null + var isFirstLaunch = true + fun getTransmittersForSat(id: Int) = liveData { emit(repository.getTransmittersByCatNum(id)) } + fun getGSP(): LiveData = _gsp + fun getSatPassList(): LiveData> = _satPassList + fun getRefreshing(): LiveData = _isListRefreshing + fun getDebugMessage(): LiveData = _debugMessage fun getRefreshRate() = prefsManager.getRefreshRate() fun getHoursAhead() = prefsManager.getHoursAhead() fun getMinElevation() = prefsManager.getMinElevation() + + suspend fun getAllEntries(): List { + return repository.getAllEntries() + } + + fun setPassPrefs(hoursAhead: Int, minEl: Double) { + prefsManager.setHoursAhead(hoursAhead) + prefsManager.setMinElevation(minEl) + } + fun setPositionFromPref() = _gsp.postValue(prefsManager.getPosition()) - fun getTransmittersForSat(id: Int) = liveData { emit(repository.getTransmittersByCatNum(id)) } - - fun updateEntries() { - viewModelScope.launch { - val selected = repository.getSelectedEntries() - repository.updateEntriesFrom(urlList) - repository.updateEntriesSelection(selected) - } - } - - fun updateEntriesSelection(entries: List) { - viewModelScope.launch { - repository.updateEntriesSelection(entries) - calculatePasses() - } - } - fun updatePosition() { prefsManager.getLastKnownPosition().let { prefsManager.setPosition(it) _gsp.postValue(it) + _debugMessage.postValue("Location was updated") + } + } + + fun updateEntries() { + viewModelScope.launch(Dispatchers.IO) { + val selected = repository.getSelectedEntries().map { it.catNum } + repository.updateEntriesFrom(urlList) + repository.updateEntriesSelection(selected) + _debugMessage.postValue("TLE file was updated") } } fun updateTransmitters() { viewModelScope.launch(Dispatchers.IO) { repository.updateTransmitters() + _debugMessage.postValue("Transceivers database was updated") } } - suspend fun getAllEntries(): List { - return repository.getAllEntries() + fun updateEntriesSelection(catNumList: MutableList) { + viewModelScope.launch(Dispatchers.IO) { + repository.updateEntriesSelection(catNumList) + calculatePasses() + } } fun calculatePasses() { @@ -107,21 +114,15 @@ class SharedViewModel @Inject constructor( } } - fun setPassPrefs(hoursAhead: Int, minEl: Double) { - prefsManager.setHoursAhead(hoursAhead) - prefsManager.setMinElevation(minEl) - } - private fun getPassesForEntries( entry: SatEntry, dateNow: Date, gsp: GroundStationPosition ): MutableList { - val passList = mutableListOf() val predictor = PassPredictor(entry.tle, gsp) val passes = predictor.getPasses(dateNow, getHoursAhead(), true) - passes.forEach { passList.add(SatPass(entry.tle, predictor, it)) } - return passList + val passList = passes.map { SatPass(entry.tle, predictor, it) } + return passList as MutableList } private fun filterAndSortPasses( diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt index 9f8948a7..04721e59 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PassListFragment.kt @@ -116,7 +116,12 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { binding.fabSatSelect.setOnClickListener { lifecycleScope.launch { val list = viewModel.getAllEntries() as MutableList - showSelectSatDialog(list) + if (list.isEmpty()) { + Toast.makeText(requireContext(), "Please, update TLE", Toast.LENGTH_SHORT) + .show() + } else { + showSelectSatDialog(list, binding) + } } } } @@ -171,17 +176,21 @@ class PassListFragment : Fragment(R.layout.fragment_pass_list) { .show() } - private fun showSelectSatDialog(tleMainList: MutableList) { + private fun showSelectSatDialog( + tleMainList: MutableList, + binding: FragmentPassListBinding + ) { val listener = object : SatEntryDialogFragment.EntriesSubmitListener { - override fun onEntriesSubmit(entries: MutableList) { - viewModel.updateEntriesSelection(entries) + override fun onEntriesSubmit(catNumList: MutableList) { + binding.refLayoutPassList.isRefreshing = true + viewModel.updateEntriesSelection(catNumList) } } - val dialogFragment = SatEntryDialogFragment(tleMainList).apply { + SatEntryDialogFragment(tleMainList).apply { setEntriesListener(listener) + show(mainActivity.supportFragmentManager, "SatEntryDialogFragment") } - dialogFragment.show(mainActivity.supportFragmentManager, "SatEntryDialogFragment") } private fun setTimer() { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PolarViewFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PolarViewFragment.kt index 0d73565f..2c60db66 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PolarViewFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/PolarViewFragment.kt @@ -94,10 +94,11 @@ class PolarViewFragment : Fragment(R.layout.fragment_polar_view) { } private fun refreshView() { + val rate = viewModel.getRefreshRate() lifecycleScope.launch { while (true) { polarView.invalidate() - delay(viewModel.getRefreshRate()) + delay(rate) } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/SatEntryDialogFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/SatEntryDialogFragment.kt index b6e214c8..fce91ef1 100755 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/SatEntryDialogFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/SatEntryDialogFragment.kt @@ -97,7 +97,10 @@ class SatEntryDialogFragment(private var entries: MutableList) : } private fun onPositiveClicked() { - entriesListener.onEntriesSubmit(entries) + val catNumList = mutableListOf().apply { + entries.forEach { if (it.isSelected) this.add(it.catNum) } + } + entriesListener.onEntriesSubmit(catNumList) dismiss() } @@ -128,6 +131,6 @@ class SatEntryDialogFragment(private var entries: MutableList) : } interface EntriesSubmitListener { - fun onEntriesSubmit(entries: MutableList) + fun onEntriesSubmit(catNumList: MutableList) } }