mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Swapped WorkManager for manual update check
This commit is contained in:
1 parent
1685691d2f
commit
baf61ca9bc
11 files changed
+62
-131
No files matched your search
@@ -28,13 +28,12 @@ import javax.inject.Singleton
|
||||
class SettingsManager @Inject constructor(private val prefs: SharedPreferences) : ISettingsManager {
|
||||
|
||||
companion object {
|
||||
const val keyFirstEverLaunch = "isFirstEverLaunch"
|
||||
const val keyModes = "satModes"
|
||||
const val keyCompass = "compass"
|
||||
const val keyRadarSweep = "radarSweep"
|
||||
const val keyTimeUTC = "timeUTC"
|
||||
const val keyUpdateTime = "updateTime"
|
||||
const val keyAutoUpdate = "autoUpdate"
|
||||
const val keyLastUpdateTime = "lastUpdateTime"
|
||||
const val keyAutoUpdateEnabled = "autoUpdateEnabled"
|
||||
const val keyHoursAhead = "hoursAhead"
|
||||
const val keyMinElevation = "minElevation"
|
||||
const val keyRotator = "isRotatorEnabled"
|
||||
@@ -50,14 +49,6 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences)
|
||||
const val keySelection = "selection"
|
||||
}
|
||||
|
||||
override fun isFirstEverLaunchDone(): Boolean {
|
||||
return prefs.getBoolean(keyFirstEverLaunch, false)
|
||||
}
|
||||
|
||||
override fun setFirstEverLaunchDone() {
|
||||
prefs.edit { putBoolean(keyFirstEverLaunch, true) }
|
||||
}
|
||||
|
||||
override fun loadStationLocator(): String {
|
||||
return prefs.getString(keyLocator, null) ?: "null"
|
||||
}
|
||||
@@ -124,20 +115,20 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences)
|
||||
prefs.edit { putBoolean(keyTimeUTC, value) }
|
||||
}
|
||||
|
||||
override fun getUpdateTime(): Long {
|
||||
return prefs.getLong(keyUpdateTime, 0L)
|
||||
override fun getLastUpdateTime(): Long {
|
||||
return prefs.getLong(keyLastUpdateTime, 0L)
|
||||
}
|
||||
|
||||
override fun setUpdateTime(updateTime: Long) {
|
||||
prefs.edit { putLong(keyUpdateTime, updateTime) }
|
||||
override fun setLastUpdateTime(updateTime: Long) {
|
||||
prefs.edit { putLong(keyLastUpdateTime, updateTime) }
|
||||
}
|
||||
|
||||
override fun getUpdateEnabled(): Boolean {
|
||||
return prefs.getBoolean(keyAutoUpdate, false)
|
||||
override fun getAutoUpdateEnabled(): Boolean {
|
||||
return prefs.getBoolean(keyAutoUpdateEnabled, true)
|
||||
}
|
||||
|
||||
override fun setUpdateEnabled(value: Boolean) {
|
||||
prefs.edit { putBoolean(keyAutoUpdate, value) }
|
||||
override fun setAutoUpdateEnabled(value: Boolean) {
|
||||
prefs.edit { putBoolean(keyAutoUpdateEnabled, value) }
|
||||
}
|
||||
|
||||
override fun getUseCompass(): Boolean {
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Look4Sat. Amateur radio satellite tracker and pass predictor.
|
||||
* Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.rtbishop.look4sat.framework
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.work.*
|
||||
import com.rtbishop.look4sat.presentation.MainApplication
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class UpdateManager @Inject constructor(@ApplicationContext context: Context) {
|
||||
|
||||
private val workTag = "AutoUpdateWork"
|
||||
private val workManager = WorkManager.getInstance(context)
|
||||
|
||||
fun toggleAutoUpdate(isEnabled: Boolean) {
|
||||
if (isEnabled) enableAutoUpdate() else disableAutoUpdate()
|
||||
Log.d("UpdateManager", workManager.getWorkInfosForUniqueWork(workTag).get().toString())
|
||||
}
|
||||
|
||||
private fun enableAutoUpdate() {
|
||||
val network = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
|
||||
val request = PeriodicWorkRequest.Builder(UpdateWorker::class.java, 30, TimeUnit.MINUTES)
|
||||
.setConstraints(network).build()
|
||||
workManager.enqueueUniquePeriodicWork(workTag, ExistingPeriodicWorkPolicy.REPLACE, request)
|
||||
}
|
||||
|
||||
private fun disableAutoUpdate() {
|
||||
workManager.cancelUniqueWork(workTag)
|
||||
}
|
||||
|
||||
class UpdateWorker constructor(private val context: Context, params: WorkerParameters) :
|
||||
Worker(context, params) {
|
||||
|
||||
override fun doWork(): Result {
|
||||
val date = SimpleDateFormat("d MMM yyyy - HH:mm:ss", Locale.getDefault()).format(Date())
|
||||
Log.d("UpdateWorker", "Started periodic data update on $date")
|
||||
(context.applicationContext as MainApplication).repository.updateFromWeb()
|
||||
return Result.success()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,12 @@
|
||||
package com.rtbishop.look4sat.presentation
|
||||
|
||||
import android.app.Application
|
||||
import android.util.Log
|
||||
import com.rtbishop.look4sat.domain.IDataRepository
|
||||
import com.rtbishop.look4sat.framework.SettingsManager
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltAndroidApp
|
||||
@@ -27,4 +31,23 @@ class MainApplication : Application() {
|
||||
|
||||
@Inject
|
||||
lateinit var repository: IDataRepository
|
||||
|
||||
@Inject
|
||||
lateinit var settingsManager: SettingsManager
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
checkAutoUpdate()
|
||||
}
|
||||
|
||||
private fun checkAutoUpdate() {
|
||||
if (settingsManager.getAutoUpdateEnabled()) {
|
||||
val timeDelta = System.currentTimeMillis() - settingsManager.getLastUpdateTime()
|
||||
if (timeDelta > 172800000) { // 48 hours in ms
|
||||
val sdf = SimpleDateFormat("d MMM yyyy - HH:mm:ss", Locale.getDefault())
|
||||
Log.d("AutoUpdate", "Started periodic data update on ${sdf.format(Date())}")
|
||||
repository.updateFromWeb()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,12 +40,6 @@ class PassesViewModel @Inject constructor(
|
||||
val entriesTotal: LiveData<Int> = repository.getEntriesTotal().asLiveData()
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
if (!settings.isFirstEverLaunchDone()) {
|
||||
repository.updateFromWeb()
|
||||
settings.setFirstEverLaunchDone()
|
||||
}
|
||||
}
|
||||
viewModelScope.launch {
|
||||
satelliteManager.calculatedPasses.collect { passes ->
|
||||
passesProcessing?.cancelAndJoin()
|
||||
|
||||
+12
-12
@@ -72,7 +72,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||
}
|
||||
private val contentContract = ActivityResultContracts.GetContent()
|
||||
private val contentRequest = registerForActivityResult(contentContract) { uri ->
|
||||
uri?.let { viewModel.updateDataFromFile(uri.toString()) }
|
||||
uri?.let { viewModel.updateFromFile(uri.toString()) }
|
||||
}
|
||||
private lateinit var binding: FragmentSettingsBinding
|
||||
|
||||
@@ -134,14 +134,10 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||
|
||||
private fun setupDataCard() {
|
||||
binding.run {
|
||||
setUpdateTime(viewModel.getUpdateTime())
|
||||
settingsData.dataBtnWeb.clickWithDebounce {
|
||||
// val action = SettingsFragmentDirections.settingsToSources()
|
||||
// findNavController().navigate(action)
|
||||
viewModel.updateDataFromWeb()
|
||||
}
|
||||
setUpdateTime(viewModel.getLastUpdateTime())
|
||||
settingsData.dataBtnWeb.clickWithDebounce { viewModel.updateFromWeb() }
|
||||
settingsData.dataBtnFile.clickWithDebounce { contentRequest.launch("*/*") }
|
||||
settingsData.dataBtnClear.clickWithDebounce { viewModel.clearData() }
|
||||
settingsData.dataBtnClear.clickWithDebounce { viewModel.clearAllData() }
|
||||
viewModel.entriesTotal.observe(viewLifecycleOwner) { number ->
|
||||
val entriesFormat = getString(R.string.data_entries)
|
||||
settingsData.dataEntries.text = String.format(entriesFormat, number)
|
||||
@@ -151,7 +147,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||
settingsData.dataRadios.text = String.format(radiosFormat, number)
|
||||
}
|
||||
getNavResult<List<String>>(R.id.nav_settings, "sources") {
|
||||
viewModel.updateDataFromWeb()
|
||||
viewModel.updateFromWeb()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -217,8 +213,8 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||
setOnCheckedChangeListener { _, isChecked -> viewModel.setUseUTC(isChecked) }
|
||||
}
|
||||
settingsOther.otherSwitchUpdate.apply {
|
||||
isChecked = viewModel.getUpdateEnabled()
|
||||
setOnCheckedChangeListener { _, isChecked -> viewModel.setUpdateEnabled(isChecked) }
|
||||
isChecked = viewModel.getAutoUpdateEnabled()
|
||||
setOnCheckedChangeListener { _, isChecked -> viewModel.setAutoUpdateEnabled(isChecked) }
|
||||
}
|
||||
settingsOther.otherSwitchSweep.apply {
|
||||
isChecked = viewModel.getShowSweep()
|
||||
@@ -273,7 +269,11 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||
binding.settingsData.dataProgress.isIndeterminate = false
|
||||
setUpdateTime(state.data)
|
||||
viewModel.setUpdateHandled()
|
||||
showToast(getString(R.string.data_success))
|
||||
if (state.data == 0L) {
|
||||
showToast(getString(R.string.data_clear_success))
|
||||
} else {
|
||||
showToast(getString(R.string.data_success))
|
||||
}
|
||||
}
|
||||
is DataState.Error -> {
|
||||
binding.settingsData.dataProgress.isIndeterminate = false
|
||||
|
||||
+9
-22
@@ -24,7 +24,6 @@ import com.rtbishop.look4sat.domain.ILocationManager
|
||||
import com.rtbishop.look4sat.domain.ISettingsManager
|
||||
import com.rtbishop.look4sat.domain.model.DataState
|
||||
import com.rtbishop.look4sat.domain.predict.GeoPos
|
||||
import com.rtbishop.look4sat.framework.UpdateManager
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.SharedFlow
|
||||
import javax.inject.Inject
|
||||
@@ -33,39 +32,27 @@ import javax.inject.Inject
|
||||
class SettingsViewModel @Inject constructor(
|
||||
private val locationManager: ILocationManager,
|
||||
private val repository: IDataRepository,
|
||||
private val settings: ISettingsManager,
|
||||
private val updateManager: UpdateManager
|
||||
private val settings: ISettingsManager
|
||||
) : ViewModel() {
|
||||
|
||||
val entriesTotal = repository.getEntriesTotal().asLiveData()
|
||||
val radiosTotal = repository.getRadiosTotal().asLiveData()
|
||||
|
||||
fun updateDataFromFile(uri: String) {
|
||||
repository.updateFromFile(uri)
|
||||
}
|
||||
fun updateFromFile(uri: String) = repository.updateFromFile(uri)
|
||||
|
||||
fun updateDataFromWeb() {
|
||||
// settings.saveDataSources(sources)
|
||||
// repository.updateFromWeb(sources)
|
||||
repository.updateFromWeb()
|
||||
}
|
||||
fun updateFromWeb() = repository.updateFromWeb()
|
||||
|
||||
fun clearData() {
|
||||
repository.clearAllData()
|
||||
}
|
||||
fun clearAllData() = repository.clearAllData()
|
||||
|
||||
fun getUseUTC(): Boolean = settings.getUseUTC()
|
||||
|
||||
fun setUseUTC(value: Boolean) = settings.setUseUTC(value)
|
||||
|
||||
fun getUpdateTime(): Long = settings.getUpdateTime()
|
||||
fun getLastUpdateTime(): Long = settings.getLastUpdateTime()
|
||||
|
||||
fun getUpdateEnabled(): Boolean = settings.getUpdateEnabled()
|
||||
fun getAutoUpdateEnabled(): Boolean = settings.getAutoUpdateEnabled()
|
||||
|
||||
fun setUpdateEnabled(value: Boolean) {
|
||||
updateManager.toggleAutoUpdate(value)
|
||||
settings.setUpdateEnabled(value)
|
||||
}
|
||||
fun setAutoUpdateEnabled(value: Boolean) = settings.setAutoUpdateEnabled(value)
|
||||
|
||||
fun getUseCompass(): Boolean = settings.getUseCompass()
|
||||
|
||||
@@ -95,9 +82,9 @@ class SettingsViewModel @Inject constructor(
|
||||
|
||||
fun setBTFormat(value: String) = settings.setBTFormat(value)
|
||||
|
||||
fun getBTDeviceName(): String = settings.getBTDeviceName()
|
||||
// fun getBTDeviceName(): String = settings.getBTDeviceName()
|
||||
|
||||
fun setBTDeviceName(value: String) = settings.setBTDeviceName(value)
|
||||
// fun setBTDeviceName(value: String) = settings.setBTDeviceName(value)
|
||||
|
||||
fun getBTDeviceAddr(): String = settings.getBTDeviceAddr()
|
||||
|
||||
|
||||
@@ -137,6 +137,7 @@
|
||||
<string name="data_entries">Спутников: %s</string>
|
||||
<string name="data_radios">Трансиверов: %s</string>
|
||||
<string name="data_success">Обновление прошло успешно</string>
|
||||
<string name="data_clear_success">Очистка прошла успешно</string>
|
||||
|
||||
<string name="remote_title">Настройки ротатора</string>
|
||||
<string name="remote_switch">Удаленное управление</string>
|
||||
|
||||
@@ -128,6 +128,7 @@
|
||||
<string name="data_entries">卫星:%s</string>
|
||||
<string name="data_radios">收发器:%s</string>
|
||||
<string name="data_success">更新成功完成</string>
|
||||
<string name="data_clear_success">Update completed successfully</string>
|
||||
<string name="remote_title">旋转器首选项</string>
|
||||
<string name="remote_switch">启用远程控制</string>
|
||||
</resources>
|
||||
@@ -137,6 +137,7 @@
|
||||
<string name="data_entries">Satellites: %s</string>
|
||||
<string name="data_radios">Transceivers: %s</string>
|
||||
<string name="data_success">Update completed successfully</string>
|
||||
<string name="data_clear_success">Data was cleared successfully</string>
|
||||
|
||||
<string name="remote_title">Rotator preferences</string>
|
||||
<string name="remote_switch">Enable remote control</string>
|
||||
|
||||
@@ -51,10 +51,6 @@ interface ISettingsManager {
|
||||
"X-Comm" to "https://celestrak.com/NORAD/elements/gp.php?GROUP=x-comm&FORMAT=csv"
|
||||
)
|
||||
|
||||
fun isFirstEverLaunchDone(): Boolean
|
||||
|
||||
fun setFirstEverLaunchDone()
|
||||
|
||||
fun loadStationLocator(): String
|
||||
|
||||
fun saveStationLocator(locator: String)
|
||||
@@ -75,13 +71,13 @@ interface ISettingsManager {
|
||||
|
||||
fun setUseUTC(value: Boolean)
|
||||
|
||||
fun getUpdateTime(): Long
|
||||
fun getLastUpdateTime(): Long
|
||||
|
||||
fun setUpdateTime(updateTime: Long)
|
||||
fun setLastUpdateTime(updateTime: Long)
|
||||
|
||||
fun getUpdateEnabled(): Boolean
|
||||
fun getAutoUpdateEnabled(): Boolean
|
||||
|
||||
fun setUpdateEnabled(value: Boolean)
|
||||
fun setAutoUpdateEnabled(value: Boolean)
|
||||
|
||||
fun getUseCompass(): Boolean
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ class DataRepository(
|
||||
}
|
||||
|
||||
private fun setUpdateSuccessful(updateTime: Long = System.currentTimeMillis()) {
|
||||
settingsManager.setUpdateTime(updateTime)
|
||||
settingsManager.setLastUpdateTime(updateTime)
|
||||
_updateState.value = DataState.Success(updateTime)
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user