From baf61ca9bc510ca35d807c4b7384dca93bf77b71 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sun, 23 Oct 2022 12:28:41 +0100 Subject: [PATCH] Swapped WorkManager for manual update check --- .../look4sat/framework/SettingsManager.kt | 29 +++------ .../look4sat/framework/UpdateManager.kt | 63 ------------------- .../look4sat/presentation/MainApplication.kt | 23 +++++++ .../passesScreen/PassesViewModel.kt | 6 -- .../settingsScreen/SettingsFragment.kt | 24 +++---- .../settingsScreen/SettingsViewModel.kt | 31 +++------ app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../look4sat/domain/ISettingsManager.kt | 12 ++-- .../look4sat/domain/data/DataRepository.kt | 2 +- 11 files changed, 62 insertions(+), 131 deletions(-) delete mode 100644 app/src/main/java/com/rtbishop/look4sat/framework/UpdateManager.kt diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt index eba55b8c..b01f99a0 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt @@ -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 { diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/UpdateManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/UpdateManager.kt deleted file mode 100644 index f4312ab5..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/framework/UpdateManager.kt +++ /dev/null @@ -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 . - */ -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() - } - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt index 94a346ab..42dac8d5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt @@ -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() + } + } + } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt index de007df5..ce70d51c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt @@ -40,12 +40,6 @@ class PassesViewModel @Inject constructor( val entriesTotal: LiveData = repository.getEntriesTotal().asLiveData() init { - viewModelScope.launch { - if (!settings.isFirstEverLaunchDone()) { - repository.updateFromWeb() - settings.setFirstEverLaunchDone() - } - } viewModelScope.launch { satelliteManager.calculatedPasses.collect { passes -> passesProcessing?.cancelAndJoin() diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt index d63623d2..1f673f0b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsFragment.kt @@ -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>(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 diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt index 234545d2..fb117d3b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt @@ -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() diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 24f90440..b9880f16 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -137,6 +137,7 @@ Спутников: %s Трансиверов: %s Обновление прошло успешно + Очистка прошла успешно Настройки ротатора Удаленное управление diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b9e4f2ff..63d51c6d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -128,6 +128,7 @@ 卫星:%s 收发器:%s 更新成功完成 + Update completed successfully 旋转器首选项 启用远程控制 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa59898d..9c4cb9bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,6 +137,7 @@ Satellites: %s Transceivers: %s Update completed successfully + Data was cleared successfully Rotator preferences Enable remote control diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt index b7b1525c..d5267630 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/ISettingsManager.kt @@ -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 diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt b/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt index 48d4e88a..005f720b 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/data/DataRepository.kt @@ -126,7 +126,7 @@ class DataRepository( } private fun setUpdateSuccessful(updateTime: Long = System.currentTimeMillis()) { - settingsManager.setUpdateTime(updateTime) + settingsManager.setLastUpdateTime(updateTime) _updateState.value = DataState.Success(updateTime) }