kopia lustrzana https://github.com/rt-bishop/Look4Sat
Added recent data update info
rodzic
e531eb85e3
commit
1685691d2f
|
@ -33,6 +33,7 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences)
|
||||||
const val keyCompass = "compass"
|
const val keyCompass = "compass"
|
||||||
const val keyRadarSweep = "radarSweep"
|
const val keyRadarSweep = "radarSweep"
|
||||||
const val keyTimeUTC = "timeUTC"
|
const val keyTimeUTC = "timeUTC"
|
||||||
|
const val keyUpdateTime = "updateTime"
|
||||||
const val keyAutoUpdate = "autoUpdate"
|
const val keyAutoUpdate = "autoUpdate"
|
||||||
const val keyHoursAhead = "hoursAhead"
|
const val keyHoursAhead = "hoursAhead"
|
||||||
const val keyMinElevation = "minElevation"
|
const val keyMinElevation = "minElevation"
|
||||||
|
@ -123,6 +124,14 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences)
|
||||||
prefs.edit { putBoolean(keyTimeUTC, value) }
|
prefs.edit { putBoolean(keyTimeUTC, value) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getUpdateTime(): Long {
|
||||||
|
return prefs.getLong(keyUpdateTime, 0L)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setUpdateTime(updateTime: Long) {
|
||||||
|
prefs.edit { putLong(keyUpdateTime, updateTime) }
|
||||||
|
}
|
||||||
|
|
||||||
override fun getUpdateEnabled(): Boolean {
|
override fun getUpdateEnabled(): Boolean {
|
||||||
return prefs.getBoolean(keyAutoUpdate, false)
|
return prefs.getBoolean(keyAutoUpdate, false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import android.util.Log
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import com.rtbishop.look4sat.presentation.MainApplication
|
import com.rtbishop.look4sat.presentation.MainApplication
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import java.text.DateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
@ -41,7 +41,7 @@ class UpdateManager @Inject constructor(@ApplicationContext context: Context) {
|
||||||
|
|
||||||
private fun enableAutoUpdate() {
|
private fun enableAutoUpdate() {
|
||||||
val network = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
|
val network = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
|
||||||
val request = PeriodicWorkRequest.Builder(UpdateWorker::class.java, 24, TimeUnit.HOURS)
|
val request = PeriodicWorkRequest.Builder(UpdateWorker::class.java, 30, TimeUnit.MINUTES)
|
||||||
.setConstraints(network).build()
|
.setConstraints(network).build()
|
||||||
workManager.enqueueUniquePeriodicWork(workTag, ExistingPeriodicWorkPolicy.REPLACE, request)
|
workManager.enqueueUniquePeriodicWork(workTag, ExistingPeriodicWorkPolicy.REPLACE, request)
|
||||||
}
|
}
|
||||||
|
@ -54,8 +54,8 @@ class UpdateManager @Inject constructor(@ApplicationContext context: Context) {
|
||||||
Worker(context, params) {
|
Worker(context, params) {
|
||||||
|
|
||||||
override fun doWork(): Result {
|
override fun doWork(): Result {
|
||||||
val dateTime = DateFormat.getDateTimeInstance().format(Calendar.getInstance().time)
|
val date = SimpleDateFormat("d MMM yyyy - HH:mm:ss", Locale.getDefault()).format(Date())
|
||||||
Log.d("UpdateWorker", "Started periodic data update on $dateTime")
|
Log.d("UpdateWorker", "Started periodic data update on $date")
|
||||||
(context.applicationContext as MainApplication).repository.updateFromWeb()
|
(context.applicationContext as MainApplication).repository.updateFromWeb()
|
||||||
return Result.success()
|
return Result.success()
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ import com.rtbishop.look4sat.presentation.getNavResult
|
||||||
import com.rtbishop.look4sat.utility.isValidIPv4
|
import com.rtbishop.look4sat.utility.isValidIPv4
|
||||||
import com.rtbishop.look4sat.utility.isValidPort
|
import com.rtbishop.look4sat.utility.isValidPort
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||||
|
@ -132,6 +134,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||||
|
|
||||||
private fun setupDataCard() {
|
private fun setupDataCard() {
|
||||||
binding.run {
|
binding.run {
|
||||||
|
setUpdateTime(viewModel.getUpdateTime())
|
||||||
settingsData.dataBtnWeb.clickWithDebounce {
|
settingsData.dataBtnWeb.clickWithDebounce {
|
||||||
// val action = SettingsFragmentDirections.settingsToSources()
|
// val action = SettingsFragmentDirections.settingsToSources()
|
||||||
// findNavController().navigate(action)
|
// findNavController().navigate(action)
|
||||||
|
@ -268,6 +271,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||||
when (state) {
|
when (state) {
|
||||||
is DataState.Success -> {
|
is DataState.Success -> {
|
||||||
binding.settingsData.dataProgress.isIndeterminate = false
|
binding.settingsData.dataProgress.isIndeterminate = false
|
||||||
|
setUpdateTime(state.data)
|
||||||
viewModel.setUpdateHandled()
|
viewModel.setUpdateHandled()
|
||||||
showToast(getString(R.string.data_success))
|
showToast(getString(R.string.data_success))
|
||||||
}
|
}
|
||||||
|
@ -283,6 +287,16 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setUpdateTime(updateTime: Long) {
|
||||||
|
val updatePattern = getString(R.string.data_update)
|
||||||
|
val updateDate = if (updateTime == 0L) {
|
||||||
|
getString(R.string.pass_placeholder)
|
||||||
|
} else {
|
||||||
|
SimpleDateFormat("d MMM yyyy - HH:mm:ss", Locale.getDefault()).format(Date(updateTime))
|
||||||
|
}
|
||||||
|
binding.settingsData.dataUpdate.text = String.format(updatePattern, updateDate)
|
||||||
|
}
|
||||||
|
|
||||||
private fun showToast(message: String) {
|
private fun showToast(message: String) {
|
||||||
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,8 @@ class SettingsViewModel @Inject constructor(
|
||||||
|
|
||||||
fun setUseUTC(value: Boolean) = settings.setUseUTC(value)
|
fun setUseUTC(value: Boolean) = settings.setUseUTC(value)
|
||||||
|
|
||||||
|
fun getUpdateTime(): Long = settings.getUpdateTime()
|
||||||
|
|
||||||
fun getUpdateEnabled(): Boolean = settings.getUpdateEnabled()
|
fun getUpdateEnabled(): Boolean = settings.getUpdateEnabled()
|
||||||
|
|
||||||
fun setUpdateEnabled(value: Boolean) {
|
fun setUpdateEnabled(value: Boolean) {
|
||||||
|
|
|
@ -30,6 +30,17 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/data_title"
|
app:layout_constraintStart_toEndOf="@+id/data_title"
|
||||||
app:layout_constraintTop_toTopOf="@+id/data_title" />
|
app:layout_constraintTop_toTopOf="@+id/data_title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/data_update"
|
||||||
|
style="@style/SettingsText"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:text="@string/data_update"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/data_title"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/data_title" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/data_entries"
|
android:id="@+id/data_entries"
|
||||||
style="@style/SettingsText"
|
style="@style/SettingsText"
|
||||||
|
@ -40,8 +51,8 @@
|
||||||
app:layout_constraintEnd_toStartOf="@+id/data_radios"
|
app:layout_constraintEnd_toStartOf="@+id/data_radios"
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||||
app:layout_constraintStart_toStartOf="@+id/data_title"
|
app:layout_constraintStart_toStartOf="@+id/data_update"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/data_title" />
|
app:layout_constraintTop_toBottomOf="@+id/data_update" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/data_radios"
|
android:id="@+id/data_radios"
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<string name="btn_select">Выбрать</string>
|
<string name="btn_select">Выбрать</string>
|
||||||
<string name="btn_done">Готово</string>
|
<string name="btn_done">Готово</string>
|
||||||
<string name="btn_clear">Очистить</string>
|
<string name="btn_clear">Очистить</string>
|
||||||
|
<string name="btn_clear_all">Очистить</string>
|
||||||
<string name="btn_refresh">Обновить</string>
|
<string name="btn_refresh">Обновить</string>
|
||||||
<string name="btn_map">Карта</string>
|
<string name="btn_map">Карта</string>
|
||||||
<string name="btn_filter">Фильтр</string>
|
<string name="btn_filter">Фильтр</string>
|
||||||
|
@ -132,6 +133,7 @@
|
||||||
|
|
||||||
<string name="data_title">Обновление данных</string>
|
<string name="data_title">Обновление данных</string>
|
||||||
<string name="data_error">При обновлении возникли ошибки</string>
|
<string name="data_error">При обновлении возникли ошибки</string>
|
||||||
|
<string name="data_update">Обновлено: %s</string>
|
||||||
<string name="data_entries">Спутников: %s</string>
|
<string name="data_entries">Спутников: %s</string>
|
||||||
<string name="data_radios">Трансиверов: %s</string>
|
<string name="data_radios">Трансиверов: %s</string>
|
||||||
<string name="data_success">Обновление прошло успешно</string>
|
<string name="data_success">Обновление прошло успешно</string>
|
||||||
|
|
|
@ -133,6 +133,7 @@
|
||||||
|
|
||||||
<string name="data_title">Satellite data update</string>
|
<string name="data_title">Satellite data update</string>
|
||||||
<string name="data_error">Update completed with errors</string>
|
<string name="data_error">Update completed with errors</string>
|
||||||
|
<string name="data_update">Last updated: %s</string>
|
||||||
<string name="data_entries">Satellites: %s</string>
|
<string name="data_entries">Satellites: %s</string>
|
||||||
<string name="data_radios">Transceivers: %s</string>
|
<string name="data_radios">Transceivers: %s</string>
|
||||||
<string name="data_success">Update completed successfully</string>
|
<string name="data_success">Update completed successfully</string>
|
||||||
|
|
|
@ -75,6 +75,10 @@ interface ISettingsManager {
|
||||||
|
|
||||||
fun setUseUTC(value: Boolean)
|
fun setUseUTC(value: Boolean)
|
||||||
|
|
||||||
|
fun getUpdateTime(): Long
|
||||||
|
|
||||||
|
fun setUpdateTime(updateTime: Long)
|
||||||
|
|
||||||
fun getUpdateEnabled(): Boolean
|
fun getUpdateEnabled(): Boolean
|
||||||
|
|
||||||
fun setUpdateEnabled(value: Boolean)
|
fun setUpdateEnabled(value: Boolean)
|
||||||
|
|
|
@ -62,7 +62,7 @@ class DataRepository(
|
||||||
delay(updateStateDelay)
|
delay(updateStateDelay)
|
||||||
entrySource.insertEntries(importSatellites(stream))
|
entrySource.insertEntries(importSatellites(stream))
|
||||||
}
|
}
|
||||||
_updateState.value = DataState.Success(0L)
|
setUpdateSuccessful()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ class DataRepository(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
entrySource.insertEntries(importedEntries)
|
entrySource.insertEntries(importedEntries)
|
||||||
_updateState.value = DataState.Success(0L)
|
setUpdateSuccessful()
|
||||||
}
|
}
|
||||||
repositoryScope.launch(exceptionHandler) {
|
repositoryScope.launch(exceptionHandler) {
|
||||||
remoteSource.getDataStream(remoteSource.radioApi)?.let { stream ->
|
remoteSource.getDataStream(remoteSource.radioApi)?.let { stream ->
|
||||||
|
@ -121,10 +121,15 @@ class DataRepository(
|
||||||
delay(updateStateDelay)
|
delay(updateStateDelay)
|
||||||
entrySource.deleteEntries()
|
entrySource.deleteEntries()
|
||||||
radioSource.deleteRadios()
|
radioSource.deleteRadios()
|
||||||
_updateState.value = DataState.Success(0L)
|
setUpdateSuccessful(0L)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setUpdateSuccessful(updateTime: Long = System.currentTimeMillis()) {
|
||||||
|
settingsManager.setUpdateTime(updateTime)
|
||||||
|
_updateState.value = DataState.Success(updateTime)
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun importSatellites(stream: InputStream): List<SatEntry> {
|
private suspend fun importSatellites(stream: InputStream): List<SatEntry> {
|
||||||
return dataParser.parseTLEStream(stream).map { data -> SatEntry(data) }
|
return dataParser.parseTLEStream(stream).map { data -> SatEntry(data) }
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue