Swapped WorkManager for manual update check

This commit is contained in:
Arty Bishop authored and Arty Bishop committed 2022-10-23 14:20:54 +01:00
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()
@@ -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
@@ -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()
+1
View File
@@ -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>
+1
View File
@@ -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>