kopia lustrzana https://github.com/rt-bishop/Look4Sat
Moved satellite selections storage to SharedPreferences
rodzic
a7c840d532
commit
92eec290b1
|
@ -44,6 +44,7 @@ class SettingsHandler @Inject constructor(private val prefs: SharedPreferences)
|
|||
const val keyLongitude = "stationLon"
|
||||
// const val keyPositionGPS = "setPositionGPS"
|
||||
// const val keyPositionQTH = "setPositionQTH"
|
||||
const val keySelection = "selection"
|
||||
}
|
||||
|
||||
override fun loadStationPosition(): GeoPos {
|
||||
|
@ -60,6 +61,16 @@ class SettingsHandler @Inject constructor(private val prefs: SharedPreferences)
|
|||
}
|
||||
}
|
||||
|
||||
override fun saveSatelliteSelection(catnums: List<Int>) {
|
||||
val stringList = catnums.map { catnum -> catnum.toString() }
|
||||
prefs.edit { putStringSet(keySelection, stringList.toSet()) }
|
||||
}
|
||||
|
||||
override fun loadSatelliteSelection(): List<Int> {
|
||||
val catnums = prefs.getStringSet(keySelection, emptySet())?.map { catnum -> catnum.toInt() }
|
||||
return catnums?.sorted() ?: emptyList()
|
||||
}
|
||||
|
||||
override fun getHoursAhead(): Int {
|
||||
return prefs.getInt(keyHoursAhead, 8)
|
||||
}
|
||||
|
|
|
@ -20,48 +20,29 @@ package com.rtbishop.look4sat.framework.local
|
|||
import androidx.room.*
|
||||
import com.rtbishop.look4sat.framework.model.SatEntry
|
||||
import com.rtbishop.look4sat.framework.model.SatItem
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@Dao
|
||||
interface EntriesDao {
|
||||
|
||||
@Transaction
|
||||
@Query("SELECT catnum, name, isSelected FROM entries ORDER BY name ASC")
|
||||
fun getSatelliteItems(): Flow<List<SatItem>>
|
||||
suspend fun getAllSatellites(): List<SatItem>
|
||||
|
||||
@Query("SELECT catnum FROM entries WHERE isSelected = 1")
|
||||
suspend fun getEntriesSelection(): List<Int>
|
||||
@Transaction
|
||||
suspend fun getSelectedSatellites(catnums: List<Int>): List<SatEntry> {
|
||||
val selectedSatellites = mutableListOf<SatEntry>()
|
||||
catnums.chunked(999).forEach { chunkedList ->
|
||||
selectedSatellites.addAll(getSelectedSatellitesChunked(chunkedList))
|
||||
}
|
||||
return selectedSatellites
|
||||
}
|
||||
|
||||
@Query("SELECT * FROM entries WHERE isSelected = 1")
|
||||
suspend fun getSelectedSatellites(): List<SatEntry>
|
||||
@Query("SELECT * FROM entries WHERE catnum IN (:catnums)")
|
||||
suspend fun getSelectedSatellitesChunked(catnums: List<Int>): List<SatEntry>
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertEntries(entries: List<SatEntry>)
|
||||
|
||||
@Transaction
|
||||
suspend fun updateEntries(entries: List<SatEntry>) {
|
||||
val entriesSelection = getEntriesSelection()
|
||||
insertEntries(entries)
|
||||
restoreEntriesSelection(entriesSelection)
|
||||
}
|
||||
|
||||
@Transaction
|
||||
suspend fun restoreEntriesSelection(catnums: List<Int>) {
|
||||
updateEntriesSelection(catnums)
|
||||
}
|
||||
|
||||
@Transaction
|
||||
suspend fun updateEntriesSelection(catnums: List<Int>) {
|
||||
clearEntriesSelection()
|
||||
catnums.forEach { catnum -> updateEntrySelection(catnum) }
|
||||
}
|
||||
|
||||
@Query("UPDATE entries SET isSelected = 1 WHERE catnum = :catnum")
|
||||
suspend fun updateEntrySelection(catnum: Int)
|
||||
|
||||
@Query("UPDATE entries SET isSelected = 0")
|
||||
suspend fun clearEntriesSelection()
|
||||
|
||||
@Query("DELETE FROM entries")
|
||||
suspend fun deleteEntries()
|
||||
}
|
||||
|
|
|
@ -29,8 +29,6 @@ import com.rtbishop.look4sat.framework.toDomainItems
|
|||
import com.rtbishop.look4sat.framework.toFramework
|
||||
import com.rtbishop.look4sat.framework.toFrameworkEntries
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.InputStream
|
||||
|
||||
|
@ -41,8 +39,16 @@ class LocalSource(
|
|||
private val transmittersDao: TransmittersDao,
|
||||
) : ILocalSource {
|
||||
|
||||
override fun getSatelliteItems(): Flow<List<SatItem>> {
|
||||
return entriesDao.getSatelliteItems().map { items -> items.toDomainItems() }
|
||||
override suspend fun getAllSatellites(): List<SatItem> {
|
||||
return entriesDao.getAllSatellites().toDomainItems()
|
||||
}
|
||||
|
||||
override suspend fun getSelectedSatellites(catnums: List<Int>): List<Satellite> {
|
||||
return entriesDao.getSelectedSatellites(catnums).map { entry -> entry.tle.createSat() }
|
||||
}
|
||||
|
||||
override suspend fun getTransmitters(catnum: Int): List<Transmitter> {
|
||||
return transmittersDao.getTransmitters(catnum).toDomain()
|
||||
}
|
||||
|
||||
@Suppress("BlockingMethodInNonBlockingContext")
|
||||
|
@ -50,27 +56,15 @@ class LocalSource(
|
|||
return withContext(ioDispatcher) { resolver.openInputStream(Uri.parse(uri)) }
|
||||
}
|
||||
|
||||
override suspend fun getSelectedSatellites(): List<Satellite> {
|
||||
return entriesDao.getSelectedSatellites().map { entry -> entry.tle.createSat() }
|
||||
}
|
||||
|
||||
override suspend fun getTransmitters(catnum: Int): List<Transmitter> {
|
||||
return transmittersDao.getTransmitters(catnum).toDomain()
|
||||
}
|
||||
|
||||
override suspend fun updateEntries(entries: List<SatEntry>) {
|
||||
entriesDao.updateEntries(entries.toFrameworkEntries())
|
||||
}
|
||||
|
||||
override suspend fun updateEntriesSelection(catnums: List<Int>) {
|
||||
entriesDao.updateEntriesSelection(catnums)
|
||||
entriesDao.insertEntries(entries.toFrameworkEntries())
|
||||
}
|
||||
|
||||
override suspend fun updateTransmitters(transmitters: List<Transmitter>) {
|
||||
transmittersDao.updateTransmitters(transmitters.toFramework())
|
||||
}
|
||||
|
||||
override suspend fun clearData() {
|
||||
override suspend fun clearAllData() {
|
||||
entriesDao.deleteEntries()
|
||||
transmittersDao.deleteTransmitters()
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ import androidx.room.Relation
|
|||
data class SatItem(
|
||||
val catnum: Int,
|
||||
val name: String,
|
||||
var isSelected: Boolean,
|
||||
var isSelected: Boolean = false,
|
||||
@Relation(
|
||||
parentColumn = "catnum",
|
||||
entity = Transmitter::class,
|
||||
|
|
|
@ -34,9 +34,7 @@ class EntriesViewModel @Inject constructor(
|
|||
|
||||
private val transModes = MutableLiveData(preferences.loadModesSelection())
|
||||
private val currentQuery = MutableLiveData(String())
|
||||
private val itemsFromRepo = liveData {
|
||||
repository.getSatelliteItems().collect { itemsAll -> emit(itemsAll) }
|
||||
} as MutableLiveData
|
||||
private val itemsFromRepo = liveData { emit(repository.getAllSatellites()) } as MutableLiveData
|
||||
private val itemsWithModes = transModes.switchMap { modes ->
|
||||
itemsFromRepo.map { items -> filterByModes(items, modes) }
|
||||
}
|
||||
|
@ -69,8 +67,8 @@ class EntriesViewModel @Inject constructor(
|
|||
|
||||
fun saveSelection() {
|
||||
itemsFromRepo.value?.let { itemsAll ->
|
||||
val selectedIds = itemsAll.filter { it.isSelected }.map { it.catnum }
|
||||
repository.updateSelection(selectedIds)
|
||||
val filteredItems = itemsAll.filter { item -> item.isSelected }
|
||||
repository.updatesSelection(filteredItems.map { item -> item.catnum })
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,15 +18,15 @@ class SettingsViewModel @Inject constructor(
|
|||
) : ViewModel() {
|
||||
|
||||
fun updateDataFromFile(uri: String) {
|
||||
repository.updateDataFromFile(uri)
|
||||
repository.updateFromFile(uri)
|
||||
}
|
||||
|
||||
fun updateDataFromWeb(sources: List<String>) {
|
||||
repository.updateDataFromWeb(sources)
|
||||
repository.updateFromWeb(sources)
|
||||
}
|
||||
|
||||
fun clearData() {
|
||||
repository.clearData()
|
||||
repository.clearAllData()
|
||||
}
|
||||
|
||||
fun getUseUTC(): Boolean = settings.getUseUTC()
|
||||
|
@ -53,9 +53,9 @@ class SettingsViewModel @Inject constructor(
|
|||
|
||||
fun setRotatorPort(value: String) = settings.setRotatorPort(value)
|
||||
|
||||
fun getUpdateState() = repository.dataUpdateState
|
||||
fun getUpdateState() = repository.updateState
|
||||
|
||||
fun setUpdateHandled() = repository.setDataUpdateHandled()
|
||||
fun setUpdateHandled() = repository.setUpdateStateHandled()
|
||||
|
||||
val stationPosition: SharedFlow<DataState<GeoPos>> = locationHandler.stationPosition
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@ import com.rtbishop.look4sat.domain.IDataRepository
|
|||
import com.rtbishop.look4sat.domain.model.DataState
|
||||
import com.rtbishop.look4sat.domain.model.SatEntry
|
||||
import com.rtbishop.look4sat.domain.model.SatItem
|
||||
import com.rtbishop.look4sat.domain.predict.Satellite
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import java.io.InputStream
|
||||
|
@ -43,13 +43,23 @@ class DataRepository(
|
|||
_updateState.value = DataState.Error(exception.message)
|
||||
}
|
||||
private val _updateState = MutableStateFlow<DataState<Long>>(DataState.Handled)
|
||||
override val dataUpdateState: StateFlow<DataState<Long>> = _updateState
|
||||
override val updateState: StateFlow<DataState<Long>> = _updateState
|
||||
|
||||
override fun setDataUpdateHandled() {
|
||||
_updateState.value = DataState.Handled
|
||||
override suspend fun getAllSatellites(): List<SatItem> {
|
||||
val selection = settings.loadSatelliteSelection()
|
||||
val satellites = localSource.getAllSatellites()
|
||||
satellites.forEach { satItem -> satItem.isSelected = satItem.catnum in selection }
|
||||
return satellites
|
||||
}
|
||||
|
||||
override fun updateDataFromFile(uri: String) {
|
||||
override suspend fun getSelectedSatellites(): List<Satellite> {
|
||||
val selection = settings.loadSatelliteSelection()
|
||||
return localSource.getSelectedSatellites(selection)
|
||||
}
|
||||
|
||||
override suspend fun getTransmitters(catnum: Int) = localSource.getTransmitters(catnum)
|
||||
|
||||
override fun updateFromFile(uri: String) {
|
||||
repositoryScope.launch(exceptionHandler) {
|
||||
_updateState.value = DataState.Loading
|
||||
val updateTimeMillis = measureTimeMillis {
|
||||
|
@ -61,7 +71,7 @@ class DataRepository(
|
|||
}
|
||||
}
|
||||
|
||||
override fun updateDataFromWeb(sources: List<String>) {
|
||||
override fun updateFromWeb(sources: List<String>) {
|
||||
_updateState.value = DataState.Loading
|
||||
repositoryScope.launch(exceptionHandler) {
|
||||
settings.saveDataSources(sources)
|
||||
|
@ -102,23 +112,21 @@ class DataRepository(
|
|||
}
|
||||
}
|
||||
|
||||
override fun clearData() {
|
||||
override fun updatesSelection(catnums: List<Int>) {
|
||||
repositoryScope.launch {
|
||||
_updateState.value = DataState.Loading
|
||||
localSource.clearData()
|
||||
_updateState.value = DataState.Success(0L)
|
||||
settings.saveSatelliteSelection(catnums)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getSatelliteItems(): Flow<List<SatItem>> = localSource.getSatelliteItems()
|
||||
override fun setUpdateStateHandled() {
|
||||
_updateState.value = DataState.Handled
|
||||
}
|
||||
|
||||
override suspend fun getSelectedSatellites() = localSource.getSelectedSatellites()
|
||||
|
||||
override suspend fun getTransmitters(catnum: Int) = localSource.getTransmitters(catnum)
|
||||
|
||||
override fun updateSelection(catnums: List<Int>) {
|
||||
override fun clearAllData() {
|
||||
repositoryScope.launch {
|
||||
localSource.updateEntriesSelection(catnums)
|
||||
_updateState.value = DataState.Loading
|
||||
localSource.clearAllData()
|
||||
_updateState.value = DataState.Success(0L)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,24 +21,21 @@ import com.rtbishop.look4sat.domain.model.SatEntry
|
|||
import com.rtbishop.look4sat.domain.model.SatItem
|
||||
import com.rtbishop.look4sat.domain.model.Transmitter
|
||||
import com.rtbishop.look4sat.domain.predict.Satellite
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import java.io.InputStream
|
||||
|
||||
interface ILocalSource {
|
||||
|
||||
fun getSatelliteItems(): Flow<List<SatItem>>
|
||||
suspend fun getAllSatellites(): List<SatItem>
|
||||
|
||||
suspend fun getFileStream(uri: String): InputStream?
|
||||
|
||||
suspend fun getSelectedSatellites(): List<Satellite>
|
||||
suspend fun getSelectedSatellites(catnums: List<Int>): List<Satellite>
|
||||
|
||||
suspend fun getTransmitters(catnum: Int): List<Transmitter>
|
||||
|
||||
suspend fun updateEntries(entries: List<SatEntry>)
|
||||
suspend fun getFileStream(uri: String): InputStream?
|
||||
|
||||
suspend fun updateEntriesSelection(catnums: List<Int>)
|
||||
suspend fun updateEntries(entries: List<SatEntry>)
|
||||
|
||||
suspend fun updateTransmitters(transmitters: List<Transmitter>)
|
||||
|
||||
suspend fun clearData()
|
||||
suspend fun clearAllData()
|
||||
}
|
||||
|
|
|
@ -59,6 +59,10 @@ interface ISettingsHandler {
|
|||
|
||||
fun loadModesSelection(): List<String>
|
||||
|
||||
fun saveSatelliteSelection(catnums: List<Int>)
|
||||
|
||||
fun loadSatelliteSelection(): List<Int>
|
||||
|
||||
fun getRotatorEnabled(): Boolean
|
||||
|
||||
fun setRotatorEnabled(value: Boolean)
|
||||
|
|
|
@ -21,26 +21,25 @@ import com.rtbishop.look4sat.domain.model.DataState
|
|||
import com.rtbishop.look4sat.domain.model.SatItem
|
||||
import com.rtbishop.look4sat.domain.model.Transmitter
|
||||
import com.rtbishop.look4sat.domain.predict.Satellite
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
||||
interface IDataRepository {
|
||||
|
||||
val dataUpdateState: StateFlow<DataState<Long>>
|
||||
val updateState: StateFlow<DataState<Long>>
|
||||
|
||||
fun setDataUpdateHandled()
|
||||
|
||||
fun updateDataFromFile(uri: String)
|
||||
|
||||
fun updateDataFromWeb(sources: List<String>)
|
||||
|
||||
fun clearData()
|
||||
|
||||
fun getSatelliteItems(): Flow<List<SatItem>>
|
||||
suspend fun getAllSatellites(): List<SatItem>
|
||||
|
||||
suspend fun getSelectedSatellites(): List<Satellite>
|
||||
|
||||
suspend fun getTransmitters(catnum: Int): List<Transmitter>
|
||||
|
||||
fun updateSelection(catnums: List<Int>)
|
||||
fun updateFromFile(uri: String)
|
||||
|
||||
fun updateFromWeb(sources: List<String>)
|
||||
|
||||
fun updatesSelection(catnums: List<Int>)
|
||||
|
||||
fun setUpdateStateHandled()
|
||||
|
||||
fun clearAllData()
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue