diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt b/app/src/main/java/com/rtbishop/look4sat/framework/LocationHandler.kt similarity index 93% rename from app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/LocationHandler.kt index 122411d2..9827e262 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/LocationProvider.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/LocationHandler.kt @@ -26,7 +26,7 @@ import android.location.LocationManager import android.os.Bundle import androidx.core.content.ContextCompat import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.domain.LocationHandler +import com.rtbishop.look4sat.domain.ILocationHandler import com.rtbishop.look4sat.domain.QthConverter import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.GeoPos @@ -38,10 +38,10 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class LocationProvider @Inject constructor( +class LocationHandler @Inject constructor( @ApplicationContext private val context: Context, - private val settingsProvider: SettingsProvider, -) : LocationListener, LocationHandler { + private val settingsHandler: SettingsHandler, +) : LocationListener, ILocationHandler { private val manager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager private val providerDef = LocationManager.PASSIVE_PROVIDER @@ -50,7 +50,7 @@ class LocationProvider @Inject constructor( private val locationCoarse = Manifest.permission.ACCESS_COARSE_LOCATION private val locationFine = Manifest.permission.ACCESS_FINE_LOCATION private val _stationPosition = MutableStateFlow>(DataState.Handled) - private var currentPosition = settingsProvider.loadStationPosition() + private var currentPosition = settingsHandler.loadStationPosition() override val stationPosition: StateFlow> = _stationPosition @@ -61,7 +61,7 @@ class LocationProvider @Inject constructor( val newLat = latitude.round(4) val newLon = longitude.round(4) currentPosition = GeoPos(newLat, newLon) - settingsProvider.saveStationPosition(newLat, newLon) + settingsHandler.saveStationPosition(newLat, newLon) _stationPosition.value = DataState.Success(currentPosition) } else _stationPosition.value = DataState.Error(context.getString(R.string.pref_pos_gps_null)) diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationHandler.kt similarity index 97% rename from app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/OrientationHandler.kt index b168724f..5ee7d708 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationHandler.kt @@ -26,7 +26,7 @@ import javax.inject.Singleton import kotlin.math.round @Singleton -class OrientationSource @Inject constructor(private val sensorManager: SensorManager) : +class OrientationHandler @Inject constructor(private val sensorManager: SensorManager) : SensorEventListener { interface OrientationListener { diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsProvider.kt b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsHandler.kt similarity index 96% rename from app/src/main/java/com/rtbishop/look4sat/framework/SettingsProvider.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/SettingsHandler.kt index 6f0facb9..688dce3a 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsProvider.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsHandler.kt @@ -20,13 +20,13 @@ package com.rtbishop.look4sat.framework import android.content.SharedPreferences import androidx.core.content.edit import com.rtbishop.look4sat.BuildConfig -import com.rtbishop.look4sat.data.SettingsHandler +import com.rtbishop.look4sat.data.ISettingsHandler import com.rtbishop.look4sat.domain.predict.GeoPos import javax.inject.Inject import javax.inject.Singleton @Singleton -class SettingsProvider @Inject constructor(private val prefs: SharedPreferences) : SettingsHandler { +class SettingsHandler @Inject constructor(private val prefs: SharedPreferences) : ISettingsHandler { private val keyInitialSetup = "${BuildConfig.VERSION_NAME}update" diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt index ac42361f..025d88ac 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/local/LocalSource.kt @@ -17,7 +17,7 @@ */ package com.rtbishop.look4sat.framework.local -import com.rtbishop.look4sat.data.LocalDataSource +import com.rtbishop.look4sat.data.ILocalSource import com.rtbishop.look4sat.domain.model.SatEntry import com.rtbishop.look4sat.domain.model.SatItem import com.rtbishop.look4sat.domain.model.Transmitter @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.map class LocalSource( private val entriesDao: EntriesDao, private val transmittersDao: TransmittersDao -) : LocalDataSource { +) : ILocalSource { override fun getSatelliteItems(): Flow> { return entriesDao.getSatelliteItems().map { items -> items.toDomainItems() } diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/remote/RemoteSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/remote/RemoteSource.kt index 06dc7e75..a6ef7d15 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/remote/RemoteSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/remote/RemoteSource.kt @@ -1,19 +1,15 @@ package com.rtbishop.look4sat.framework.remote -import com.rtbishop.look4sat.data.RemoteDataSource +import com.rtbishop.look4sat.data.IRemoteSource import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import java.io.InputStream import java.net.URL -class RemoteSource(private val ioDispatcher: CoroutineDispatcher) : RemoteDataSource { +class RemoteSource(private val ioDispatcher: CoroutineDispatcher) : IRemoteSource { @Suppress("BlockingMethodInNonBlockingContext") override suspend fun fetchFileStream(url: String): InputStream? { - return try { - withContext(ioDispatcher) { URL(url).openStream() } - } catch (e: Exception) { - null - } + return withContext(ioDispatcher) { URL(url).openStream() } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt index 00afa52d..ca511f8f 100644 --- a/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/CoreModule.kt @@ -20,15 +20,15 @@ package com.rtbishop.look4sat.injection import android.content.Context import android.content.SharedPreferences import androidx.room.Room -import com.rtbishop.look4sat.data.DefaultRepository -import com.rtbishop.look4sat.data.SettingsHandler +import com.rtbishop.look4sat.data.DataRepository +import com.rtbishop.look4sat.data.ISettingsHandler import com.rtbishop.look4sat.domain.DataParser import com.rtbishop.look4sat.domain.DataReporter -import com.rtbishop.look4sat.domain.DataRepository -import com.rtbishop.look4sat.domain.LocationHandler +import com.rtbishop.look4sat.domain.IDataRepository +import com.rtbishop.look4sat.domain.ILocationHandler import com.rtbishop.look4sat.domain.predict.Predictor -import com.rtbishop.look4sat.framework.LocationProvider -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.LocationHandler +import com.rtbishop.look4sat.framework.SettingsHandler import com.rtbishop.look4sat.framework.local.* import com.rtbishop.look4sat.framework.remote.RemoteSource import dagger.Module @@ -46,33 +46,33 @@ object CoreModule { @Provides @Singleton fun provideSatelliteRepo( - settingsHandler: SettingsHandler, + settingsHandler: ISettingsHandler, @ApplicationContext context: Context, @IoDispatcher ioDispatcher: CoroutineDispatcher, @DefaultDispatcher defaultDispatcher: CoroutineDispatcher - ): DataRepository { + ): IDataRepository { val dataParser = DataParser(defaultDispatcher) val db = Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb") .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5) .fallbackToDestructiveMigration().build() val localSource = LocalSource(db.entriesDao(), db.transmittersDao()) val remoteSource = RemoteSource(ioDispatcher) - return DefaultRepository(dataParser, localSource, remoteSource, settingsHandler) + return DataRepository(dataParser, localSource, remoteSource, settingsHandler) } @Provides @Singleton - fun provideSettingsHandler(sharedPreferences: SharedPreferences): SettingsHandler { - return SettingsProvider(sharedPreferences) + fun provideSettingsHandler(sharedPreferences: SharedPreferences): ISettingsHandler { + return SettingsHandler(sharedPreferences) } @Provides @Singleton fun provideLocationHandler( @ApplicationContext context: Context, - settingsProvider: SettingsProvider - ): LocationHandler { - return LocationProvider(context, settingsProvider) + settingsHandler: SettingsHandler + ): ILocationHandler { + return LocationHandler(context, settingsHandler) } @Provides diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt index 148065f8..6c0e4505 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt @@ -2,9 +2,9 @@ package com.rtbishop.look4sat.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.predict.Predictor -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -12,8 +12,8 @@ import javax.inject.Inject @HiltViewModel class MainViewModel @Inject constructor( private val predictor: Predictor, - private val preferences: SettingsProvider, - private val dataRepository: DataRepository + private val preferences: SettingsHandler, + private val dataRepository: IDataRepository ) : ViewModel() { fun calculatePasses( diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt index c1bd9201..119ea24b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt @@ -19,10 +19,10 @@ package com.rtbishop.look4sat.presentation.entriesScreen import android.widget.SearchView import androidx.lifecycle.* -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.model.SatItem -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import java.util.* @@ -30,8 +30,8 @@ import javax.inject.Inject @HiltViewModel class EntriesViewModel @Inject constructor( - private val preferences: SettingsProvider, - private val dataRepository: DataRepository + private val preferences: SettingsHandler, + private val dataRepository: IDataRepository ) : ViewModel(), SearchView.OnQueryTextListener, EntriesAdapter.EntriesClickListener { private val transModes = MutableLiveData(preferences.loadModesSelection()) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt index e6f2cd04..545bb451 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt @@ -18,12 +18,12 @@ package com.rtbishop.look4sat.presentation.mapScreen import androidx.lifecycle.* -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.QthConverter import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.Predictor import com.rtbishop.look4sat.domain.predict.Satellite -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* import java.util.* @@ -33,9 +33,9 @@ import kotlin.math.min @HiltViewModel class MapViewModel @Inject constructor( - private val dataRepository: DataRepository, + private val dataRepository: IDataRepository, private val predictor: Predictor, - preferences: SettingsProvider, + preferences: SettingsHandler, ) : ViewModel() { private val stationPos = preferences.loadStationPosition() diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt index 2b070ffb..6eaa0283 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt @@ -8,7 +8,7 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatDialogFragment import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.DialogPassesBinding -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import com.rtbishop.look4sat.presentation.setNavResult import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -17,7 +17,7 @@ import javax.inject.Inject class PassesPrefsDialog : AppCompatDialogFragment() { @Inject - lateinit var preferences: SettingsProvider + lateinit var preferences: SettingsHandler override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { return inflater.inflate(R.layout.dialog_passes, group, false) 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 1e97caa8..d2d236ef 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 @@ -21,20 +21,20 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.Predictor import com.rtbishop.look4sat.domain.predict.SatPass -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* import javax.inject.Inject @HiltViewModel class PassesViewModel @Inject constructor( - private val dataRepository: DataRepository, + private val dataRepository: IDataRepository, private val predictor: Predictor, - private val preferences: SettingsProvider + private val preferences: SettingsHandler ) : ViewModel() { private val _passes = MutableLiveData>>() diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt index 1fa496a9..e21c0234 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt @@ -30,7 +30,7 @@ import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentRadarBinding import com.rtbishop.look4sat.domain.predict.SatPass import com.rtbishop.look4sat.domain.predict.SatPos -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import com.rtbishop.look4sat.presentation.navigateSafe import com.rtbishop.look4sat.presentation.toTimerString import dagger.hilt.android.AndroidEntryPoint @@ -40,7 +40,7 @@ import javax.inject.Inject class RadarFragment : Fragment(R.layout.fragment_radar) { @Inject - lateinit var preferences: SettingsProvider + lateinit var preferences: SettingsHandler private val viewModel: RadarViewModel by viewModels() private var radarView: RadarView? = null diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarViewModel.kt index e5f294e1..2a0a58fb 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarViewModel.kt @@ -20,14 +20,14 @@ package com.rtbishop.look4sat.presentation.radarScreen import android.hardware.GeomagneticField import androidx.lifecycle.* import com.rtbishop.look4sat.domain.DataReporter -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.model.Transmitter import com.rtbishop.look4sat.domain.predict.GeoPos import com.rtbishop.look4sat.domain.predict.Predictor import com.rtbishop.look4sat.domain.predict.SatPass import com.rtbishop.look4sat.domain.predict.SatPos -import com.rtbishop.look4sat.framework.OrientationSource -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.OrientationHandler +import com.rtbishop.look4sat.framework.SettingsHandler import com.rtbishop.look4sat.presentation.round import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay @@ -38,12 +38,12 @@ import javax.inject.Inject @HiltViewModel class RadarViewModel @Inject constructor( - private val orientationSource: OrientationSource, - private val preferences: SettingsProvider, + private val orientationHandler: OrientationHandler, + private val preferences: SettingsHandler, private val predictor: Predictor, - private val dataRepository: DataRepository, + private val dataRepository: IDataRepository, private val dataReporter: DataReporter -) : ViewModel(), OrientationSource.OrientationListener { +) : ViewModel(), OrientationHandler.OrientationListener { private val stationPos = preferences.loadStationPosition() private val _passData = MutableLiveData() @@ -65,11 +65,11 @@ class RadarViewModel @Inject constructor( } fun enableSensor() { - if (preferences.getUseCompass()) orientationSource.startListening(this) + if (preferences.getUseCompass()) orientationHandler.startListening(this) } fun disableSensor() { - if (preferences.getUseCompass()) orientationSource.stopListening() + if (preferences.getUseCompass()) orientationHandler.stopListening() } override fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float) { 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 76f3e6a9..432df3ec 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 @@ -18,7 +18,6 @@ package com.rtbishop.look4sat.presentation.settingsScreen import android.Manifest -import android.content.ContentResolver import android.content.Intent import android.net.Uri import android.os.Bundle @@ -30,17 +29,15 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.asLiveData -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.rtbishop.look4sat.BuildConfig import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentSettingsBinding -import com.rtbishop.look4sat.domain.DataRepository -import com.rtbishop.look4sat.domain.LocationHandler import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.GeoPos -import com.rtbishop.look4sat.framework.SettingsProvider +import com.rtbishop.look4sat.framework.SettingsHandler import com.rtbishop.look4sat.presentation.* import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -49,33 +46,22 @@ import javax.inject.Inject class SettingsFragment : Fragment(R.layout.fragment_settings) { @Inject - lateinit var preferences: SettingsProvider - - @Inject - lateinit var locationHandler: LocationHandler - - @Inject - lateinit var resolver: ContentResolver - - @Inject - lateinit var dataRepository: DataRepository + lateinit var preferences: SettingsHandler + private val viewModel: SettingsViewModel by viewModels() private val locationFine = Manifest.permission.ACCESS_FINE_LOCATION private val locationCoarse = Manifest.permission.ACCESS_COARSE_LOCATION private val locationContract = ActivityResultContracts.RequestMultiplePermissions() private val locationRequest = registerForActivityResult(locationContract) { permissions -> when { - permissions[locationFine] == true -> locationHandler.setPositionFromGps() - permissions[locationCoarse] == true -> locationHandler.setPositionFromNet() + permissions[locationFine] == true -> viewModel.setPositionFromGps() + permissions[locationCoarse] == true -> viewModel.setPositionFromNet() else -> showToast(getString(R.string.pref_pos_gps_error)) } } private val contentContract = ActivityResultContracts.GetContent() private val contentRequest = registerForActivityResult(contentContract) { uri -> - lifecycleScope.launchWhenResumed { - @Suppress("BlockingMethodInNonBlockingContext") - resolver.openInputStream(uri)?.use { dataRepository.updateDataFromFile(it) } - } + viewModel.updateDataFromFile(uri) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -88,7 +74,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { setupTrackingCard(settingsBinding) setupOtherCard(settingsBinding) setupWarrantyCard(settingsBinding) - locationHandler.stationPosition.asLiveData().observe(viewLifecycleOwner) { stationPos -> + viewModel.stationPosition.asLiveData().observe(viewLifecycleOwner) { stationPos -> stationPos?.let { handleStationPosition(it, settingsBinding) } } } @@ -108,7 +94,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { } private fun setupLocationCard(binding: FragmentSettingsBinding) { - setPositionText(locationHandler.getStationPosition(), binding) + setPositionText(viewModel.getStationPosition(), binding) binding.prefsLocation.locationBtnGps.setOnClickListener { locationRequest.launch(arrayOf(locationFine, locationCoarse)) } @@ -119,7 +105,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { .setEditText(editText) .setPositiveButton("OK") { _, _ -> val editTextInput = editText.text.toString() - locationHandler.setPositionFromQth(editTextInput) + viewModel.setPositionFromQth(editTextInput) } .setNeutralButton("Cancel", null) .create() @@ -133,7 +119,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { findNavController().navigateSafe(R.id.action_prefs_to_sources) } getNavResult>(R.id.nav_settings, "sources") { sources -> - lifecycleScope.launchWhenResumed { dataRepository.updateDataFromWeb(sources) } + viewModel.updateDataFromWeb(sources) } } @@ -191,12 +177,12 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) { setPositionText(pos.data, binding) binding.prefsLocation.locationProgress.isIndeterminate = false showToast(getString(R.string.pref_pos_success)) - locationHandler.setPositionHandled() + viewModel.setPositionHandled() } is DataState.Error -> { binding.prefsLocation.locationProgress.isIndeterminate = false showToast(pos.message.toString()) - locationHandler.setPositionHandled() + viewModel.setPositionHandled() } DataState.Loading -> { binding.prefsLocation.locationProgress.isIndeterminate = true 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 new file mode 100644 index 00000000..d3bf915b --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/SettingsViewModel.kt @@ -0,0 +1,62 @@ +package com.rtbishop.look4sat.presentation.settingsScreen + +import android.content.ContentResolver +import android.net.Uri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.rtbishop.look4sat.domain.IDataRepository +import com.rtbishop.look4sat.domain.ILocationHandler +import com.rtbishop.look4sat.domain.model.DataState +import com.rtbishop.look4sat.domain.predict.GeoPos +import com.rtbishop.look4sat.framework.SettingsHandler +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsViewModel @Inject constructor( + private val resolver: ContentResolver, + private val settingsHandler: SettingsHandler, + private val dataRepository: IDataRepository, + private val locationHandler: ILocationHandler +) : ViewModel(), ILocationHandler { + + private val exceptionHandler = CoroutineExceptionHandler { _, exception -> + println("Handled $exception in CoroutineExceptionHandler") + } + + fun updateDataFromFile(uri: Uri) { + viewModelScope.launch(exceptionHandler) { + @Suppress("BlockingMethodInNonBlockingContext") + resolver.openInputStream(uri)?.use { fileUri -> + dataRepository.updateDataFromFile(fileUri) + } + } + } + + fun updateDataFromWeb(sources: List) { + viewModelScope.launch(exceptionHandler) { + dataRepository.updateDataFromWeb(sources) + } + } + + override val stationPosition: SharedFlow> = locationHandler.stationPosition + + override fun getStationPosition(): GeoPos = locationHandler.getStationPosition() + + override fun setStationPosition(latitude: Double, longitude: Double) { + locationHandler.setStationPosition(latitude, longitude) + } + + override fun setPositionFromGps() = locationHandler.setPositionFromGps() + + override fun setPositionFromNet() = locationHandler.setPositionFromNet() + + override fun setPositionFromQth(qthString: String) { + locationHandler.setPositionFromQth(qthString) + } + + override fun setPositionHandled() = locationHandler.setPositionHandled() +} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt index 9f984848..bbe6830b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt @@ -25,7 +25,7 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatDialogFragment import androidx.recyclerview.widget.LinearLayoutManager import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.data.SettingsHandler +import com.rtbishop.look4sat.data.ISettingsHandler import com.rtbishop.look4sat.databinding.DialogSourcesBinding import com.rtbishop.look4sat.framework.model.Source import com.rtbishop.look4sat.presentation.setNavResult @@ -36,7 +36,7 @@ import javax.inject.Inject class SourcesDialog : AppCompatDialogFragment() { @Inject - lateinit var settings: SettingsHandler + lateinit var settings: ISettingsHandler override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { return inflater.inflate(R.layout.dialog_sources, group, false) diff --git a/core/src/main/java/com/rtbishop/look4sat/data/DefaultRepository.kt b/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt similarity index 90% rename from core/src/main/java/com/rtbishop/look4sat/data/DefaultRepository.kt rename to core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt index 5f1b3e09..178fc3e9 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/DefaultRepository.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/DataRepository.kt @@ -18,7 +18,7 @@ package com.rtbishop.look4sat.data import com.rtbishop.look4sat.domain.DataParser -import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.model.SatEntry import kotlinx.coroutines.Deferred import kotlinx.coroutines.async @@ -28,12 +28,12 @@ import java.io.InputStream import java.util.zip.ZipInputStream import kotlin.system.measureTimeMillis -class DefaultRepository( +class DataRepository( private val dataParser: DataParser, - private val localSource: LocalDataSource, - private val remoteSource: RemoteDataSource, - private val settings: SettingsHandler -) : DataRepository { + private val localSource: ILocalSource, + private val remoteSource: IRemoteSource, + private val settingsHandler: ISettingsHandler +) : IDataRepository { override fun getSatelliteItems() = localSource.getSatelliteItems() @@ -48,7 +48,7 @@ class DefaultRepository( override suspend fun updateDataFromWeb(sources: List) { coroutineScope { launch { - settings.saveDataSources(sources) + settingsHandler.saveDataSources(sources) } launch { val updateTimeMillis = measureTimeMillis { @@ -78,8 +78,8 @@ class DefaultRepository( println("Update from web took $updateTimeMillis ms") } launch { - remoteSource.fetchFileStream(settings.transmittersSource)?.let { inputStream -> - val transmitters = dataParser.parseJSONStream(inputStream) + remoteSource.fetchFileStream(settingsHandler.transmittersSource)?.let { stream -> + val transmitters = dataParser.parseJSONStream(stream) localSource.updateTransmitters(transmitters) } } diff --git a/core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt similarity index 98% rename from core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt rename to core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt index f51602e9..573845c1 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/ILocalSource.kt @@ -23,7 +23,7 @@ import com.rtbishop.look4sat.domain.model.Transmitter import com.rtbishop.look4sat.domain.predict.Satellite import kotlinx.coroutines.flow.Flow -interface LocalDataSource { +interface ILocalSource { fun getSatelliteItems(): Flow> diff --git a/core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/IRemoteSource.kt similarity index 96% rename from core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt rename to core/src/main/java/com/rtbishop/look4sat/data/IRemoteSource.kt index b7a9a9a1..e5ba5830 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/IRemoteSource.kt @@ -19,7 +19,7 @@ package com.rtbishop.look4sat.data import java.io.InputStream -interface RemoteDataSource { +interface IRemoteSource { suspend fun fetchFileStream(url: String): InputStream? } diff --git a/core/src/main/java/com/rtbishop/look4sat/data/SettingsHandler.kt b/core/src/main/java/com/rtbishop/look4sat/data/ISettingsHandler.kt similarity index 97% rename from core/src/main/java/com/rtbishop/look4sat/data/SettingsHandler.kt rename to core/src/main/java/com/rtbishop/look4sat/data/ISettingsHandler.kt index bbe4bfa5..3c2b130e 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/SettingsHandler.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/ISettingsHandler.kt @@ -17,7 +17,7 @@ */ package com.rtbishop.look4sat.data -interface SettingsHandler { +interface ISettingsHandler { val defaultSources: List get() = listOf( diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/DataRepository.kt b/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt similarity index 98% rename from core/src/main/java/com/rtbishop/look4sat/domain/DataRepository.kt rename to core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt index a63d88a3..2742c10d 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/DataRepository.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/IDataRepository.kt @@ -23,7 +23,7 @@ import com.rtbishop.look4sat.domain.predict.Satellite import kotlinx.coroutines.flow.Flow import java.io.InputStream -interface DataRepository { +interface IDataRepository { fun getSatelliteItems(): Flow> diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt b/core/src/main/java/com/rtbishop/look4sat/domain/ILocationHandler.kt similarity index 94% rename from core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt rename to core/src/main/java/com/rtbishop/look4sat/domain/ILocationHandler.kt index edfac04a..31907102 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/LocationHandler.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/ILocationHandler.kt @@ -4,7 +4,7 @@ import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.predict.GeoPos import kotlinx.coroutines.flow.SharedFlow -interface LocationHandler { +interface ILocationHandler { val stationPosition: SharedFlow>