From 1a59b5e3e11ece5d6b62a3cf6c28c6c770c68c57 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Thu, 6 May 2021 11:37:29 +0100 Subject: [PATCH] Extracted station position management to a separate class --- app/build.gradle | 5 - .../2.json | 114 ------------------ .../3.json | 114 ------------------ .../1.json | 114 ------------------ .../rtbishop/look4sat/di/DataSourceModule.kt | 31 ++++- .../rtbishop/look4sat/di/InteractorsModule.kt | 2 +- .../framework/DefaultLocationSource.kt | 62 ++++++++++ .../OrientationProvider.kt | 2 +- .../{utility => framework}/PrefsManager.kt | 35 +----- .../look4sat/framework/db/SatelliteDb.kt | 2 +- .../look4sat/presentation/Look4SatActivity.kt | 11 +- .../entriesScreen/EntriesViewModel.kt | 6 +- .../presentation/mapScreen/MapFragment.kt | 10 +- .../presentation/mapScreen/MapViewModel.kt | 15 +-- .../passesScreen/PassesViewModel.kt | 2 +- .../polarScreen/PolarViewModel.kt | 8 +- .../presentation/prefsScreen/PrefsFragment.kt | 49 ++++---- .../sourcesDialog/SourcesDialog.kt | 2 +- .../rtbishop/look4sat/utility/PassesRepo.kt | 5 +- .../rtbishop/look4sat/data/LocationRepo.kt | 35 ++++++ .../rtbishop/look4sat/data/LocationSource.kt | 14 +++ ...faultSatelliteRepo.kt => SatelliteRepo.kt} | 17 ++- .../rtbishop/look4sat/domain/SatelliteRepo.kt | 22 ---- .../domain/predict4kotlin/QthConverter.kt | 8 +- .../look4sat/interactors/GetSatItems.kt | 2 +- .../interactors/GetSelectedSatellites.kt | 2 +- .../interactors/GetTransmittersForSat.kt | 2 +- .../interactors/ImportDataFromStream.kt | 2 +- .../look4sat/interactors/ImportDataFromWeb.kt | 2 +- .../interactors/UpdateEntriesSelection.kt | 2 +- .../com/rtbishop/look4sat/QthConverterTest.kt | 38 +++--- 31 files changed, 233 insertions(+), 502 deletions(-) delete mode 100644 app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/2.json delete mode 100644 app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/3.json delete mode 100644 app/schemas/com.rtbishop.look4sat.framework.db.SatelliteDb/1.json create mode 100644 app/src/main/java/com/rtbishop/look4sat/framework/DefaultLocationSource.kt rename app/src/main/java/com/rtbishop/look4sat/{utility => framework}/OrientationProvider.kt (98%) rename app/src/main/java/com/rtbishop/look4sat/{utility => framework}/PrefsManager.kt (73%) create mode 100644 core/src/main/java/com/rtbishop/look4sat/data/LocationRepo.kt create mode 100644 core/src/main/java/com/rtbishop/look4sat/data/LocationSource.kt rename core/src/main/java/com/rtbishop/look4sat/data/{DefaultSatelliteRepo.kt => SatelliteRepo.kt} (80%) delete mode 100644 core/src/main/java/com/rtbishop/look4sat/domain/SatelliteRepo.kt diff --git a/app/build.gradle b/app/build.gradle index 94afb3d6..bcc83a28 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,11 +15,6 @@ android { targetSdkVersion 30 versionCode 240 versionName "2.4.0" - kapt { - arguments { - arg("room.schemaLocation", "$projectDir/schemas") - } - } } buildTypes { diff --git a/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/2.json b/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/2.json deleted file mode 100644 index 3fcf5f9f..00000000 --- a/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/2.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 2, - "identityHash": "24170ecaf2ab85adb66aa3b557134997", - "entities": [ - { - "tableName": "entries", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tle` TEXT NOT NULL, `isSelected` INTEGER NOT NULL, `catNum` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`catNum`))", - "fields": [ - { - "fieldPath": "tle", - "columnName": "tle", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isSelected", - "columnName": "isSelected", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "catNum" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - }, - { - "tableName": "transmitters", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uuid` TEXT NOT NULL, `description` TEXT NOT NULL, `isAlive` INTEGER NOT NULL, `uplink` INTEGER, `downlink` INTEGER, `mode` TEXT, `isInverted` INTEGER NOT NULL, `catNum` INTEGER NOT NULL, PRIMARY KEY(`uuid`))", - "fields": [ - { - "fieldPath": "uuid", - "columnName": "uuid", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "description", - "columnName": "description", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isAlive", - "columnName": "isAlive", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "uplink", - "columnName": "uplink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "downlink", - "columnName": "downlink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "mode", - "columnName": "mode", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "isInverted", - "columnName": "isInverted", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "uuid" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '24170ecaf2ab85adb66aa3b557134997')" - ] - } -} \ No newline at end of file diff --git a/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/3.json b/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/3.json deleted file mode 100644 index a8143337..00000000 --- a/app/schemas/com.rtbishop.look4sat.data.database.SatelliteDb/3.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 3, - "identityHash": "53fa623fc55b279c50d33e6263866a89", - "entities": [ - { - "tableName": "entries", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tle` TEXT NOT NULL, `isSelected` INTEGER NOT NULL, `catNum` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY(`catNum`))", - "fields": [ - { - "fieldPath": "tle", - "columnName": "tle", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isSelected", - "columnName": "isSelected", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "catNum" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - }, - { - "tableName": "transmitters", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uuid` TEXT NOT NULL, `info` TEXT NOT NULL, `isAlive` INTEGER NOT NULL, `downlink` INTEGER, `uplink` INTEGER, `mode` TEXT, `isInverted` INTEGER NOT NULL, `catNum` INTEGER NOT NULL, PRIMARY KEY(`uuid`))", - "fields": [ - { - "fieldPath": "uuid", - "columnName": "uuid", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "info", - "columnName": "info", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isAlive", - "columnName": "isAlive", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "downlink", - "columnName": "downlink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "uplink", - "columnName": "uplink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "mode", - "columnName": "mode", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "isInverted", - "columnName": "isInverted", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "uuid" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '53fa623fc55b279c50d33e6263866a89')" - ] - } -} \ No newline at end of file diff --git a/app/schemas/com.rtbishop.look4sat.framework.db.SatelliteDb/1.json b/app/schemas/com.rtbishop.look4sat.framework.db.SatelliteDb/1.json deleted file mode 100644 index 077b4a03..00000000 --- a/app/schemas/com.rtbishop.look4sat.framework.db.SatelliteDb/1.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 1, - "identityHash": "53fa623fc55b279c50d33e6263866a89", - "entities": [ - { - "tableName": "entries", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tle` TEXT NOT NULL, `catNum` INTEGER NOT NULL, `name` TEXT NOT NULL, `isSelected` INTEGER NOT NULL, PRIMARY KEY(`catNum`))", - "fields": [ - { - "fieldPath": "tle", - "columnName": "tle", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isSelected", - "columnName": "isSelected", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "catNum" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - }, - { - "tableName": "transmitters", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uuid` TEXT NOT NULL, `info` TEXT NOT NULL, `isAlive` INTEGER NOT NULL, `downlink` INTEGER, `uplink` INTEGER, `mode` TEXT, `isInverted` INTEGER NOT NULL, `catNum` INTEGER NOT NULL, PRIMARY KEY(`uuid`))", - "fields": [ - { - "fieldPath": "uuid", - "columnName": "uuid", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "info", - "columnName": "info", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isAlive", - "columnName": "isAlive", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "downlink", - "columnName": "downlink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "uplink", - "columnName": "uplink", - "affinity": "INTEGER", - "notNull": false - }, - { - "fieldPath": "mode", - "columnName": "mode", - "affinity": "TEXT", - "notNull": false - }, - { - "fieldPath": "isInverted", - "columnName": "isInverted", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "catNum", - "columnName": "catNum", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "columnNames": [ - "uuid" - ], - "autoGenerate": false - }, - "indices": [], - "foreignKeys": [] - } - ], - "views": [], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '53fa623fc55b279c50d33e6263866a89')" - ] - } -} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt b/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt index d4bd46e9..5519414e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt @@ -18,11 +18,12 @@ package com.rtbishop.look4sat.di import android.content.Context +import android.content.SharedPreferences +import android.location.LocationManager import androidx.room.Room -import com.rtbishop.look4sat.data.DefaultSatelliteRepo -import com.rtbishop.look4sat.data.LocalDataSource -import com.rtbishop.look4sat.data.RemoteDataSource -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.* +import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter +import com.rtbishop.look4sat.framework.DefaultLocationSource import com.rtbishop.look4sat.framework.api.NetworkDataSource import com.rtbishop.look4sat.framework.api.SatelliteService import com.rtbishop.look4sat.framework.db.RoomConverters @@ -51,12 +52,30 @@ object DataSourceModule { @Provides @Singleton - fun provideDefaultRepository( + fun provideLocationSource( + locationManager: LocationManager, + preferences: SharedPreferences + ): LocationSource { + return DefaultLocationSource(locationManager, preferences) + } + + @Provides + @Singleton + fun provideLocationRepo( + locationSource: LocationSource, + qthConverter: QthConverter + ): LocationRepo { + return LocationRepo(locationSource, qthConverter) + } + + @Provides + @Singleton + fun provideSatelliteRepo( localSource: LocalDataSource, remoteSource: RemoteDataSource, @IoDispatcher ioDispatcher: CoroutineDispatcher ): SatelliteRepo { - return DefaultSatelliteRepo(localSource, remoteSource, ioDispatcher) + return SatelliteRepo(localSource, remoteSource, ioDispatcher) } @Provides diff --git a/app/src/main/java/com/rtbishop/look4sat/di/InteractorsModule.kt b/app/src/main/java/com/rtbishop/look4sat/di/InteractorsModule.kt index cce68a69..51a56d64 100644 --- a/app/src/main/java/com/rtbishop/look4sat/di/InteractorsModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/di/InteractorsModule.kt @@ -17,7 +17,7 @@ */ package com.rtbishop.look4sat.di -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo import com.rtbishop.look4sat.interactors.* import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/DefaultLocationSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/DefaultLocationSource.kt new file mode 100644 index 00000000..e0b5b59a --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/framework/DefaultLocationSource.kt @@ -0,0 +1,62 @@ +package com.rtbishop.look4sat.framework + +import android.content.SharedPreferences +import android.hardware.GeomagneticField +import android.location.LocationManager +import androidx.core.content.edit +import com.rtbishop.look4sat.data.LocationSource +import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition +import com.rtbishop.look4sat.utility.round +import javax.inject.Inject + +class DefaultLocationSource @Inject constructor( + private val locationManager: LocationManager, + private val preferences: SharedPreferences +) : LocationSource { + + companion object { + const val keyLatitude = "stationLat" + const val keyLongitude = "stationLon" + const val keyAltitude = "stationAlt" + const val keyPositionGPS = "setPositionGPS" + const val keyPositionQTH = "setPositionQTH" + } + + override fun getLastKnownLocation(): StationPosition? { + return try { + val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER) + if (location == null) null + else { + val latitude = location.latitude.round(4) + val longitude = location.longitude.round(4) + val altitude = location.altitude.round(1) + return StationPosition(latitude, longitude, altitude) + } + } catch (exception: SecurityException) { + null + } + } + + override fun getMagDeclination(position: StationPosition): Float { + val lat = position.latitude.toFloat() + val lon = position.longitude.toFloat() + val alt = position.altitude.toFloat() + return GeomagneticField(lat, lon, alt, System.currentTimeMillis()).declination + } + + override fun loadStationPosition(): StationPosition { + val defaultSP = "0.0" + val latitude = preferences.getString(keyLatitude, null) ?: defaultSP + val longitude = preferences.getString(keyLongitude, null) ?: defaultSP + val altitude = preferences.getString(keyAltitude, null) ?: defaultSP + return StationPosition(latitude.toDouble(), longitude.toDouble(), altitude.toDouble()) + } + + override fun saveStationPosition(position: StationPosition) { + preferences.edit { + putString(keyLatitude, position.latitude.toString()) + putString(keyLongitude, position.longitude.toString()) + putString(keyAltitude, position.altitude.toString()) + } + } +} diff --git a/app/src/main/java/com/rtbishop/look4sat/utility/OrientationProvider.kt b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationProvider.kt similarity index 98% rename from app/src/main/java/com/rtbishop/look4sat/utility/OrientationProvider.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/OrientationProvider.kt index 9ab32b70..95858b35 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/OrientationProvider.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationProvider.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.rtbishop.look4sat.utility +package com.rtbishop.look4sat.framework import android.hardware.Sensor import android.hardware.SensorEvent diff --git a/app/src/main/java/com/rtbishop/look4sat/utility/PrefsManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/PrefsManager.kt similarity index 73% rename from app/src/main/java/com/rtbishop/look4sat/utility/PrefsManager.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/PrefsManager.kt index af763afb..1e8a06af 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/PrefsManager.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/PrefsManager.kt @@ -15,20 +15,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.rtbishop.look4sat.utility +package com.rtbishop.look4sat.framework import android.content.SharedPreferences -import android.hardware.GeomagneticField import androidx.core.content.edit import com.rtbishop.look4sat.framework.model.TleSource -import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition import com.squareup.moshi.Moshi import com.squareup.moshi.Types import javax.inject.Inject import javax.inject.Singleton @Singleton -class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi: Moshi) { +class PrefsManager @Inject constructor(private val preferences: SharedPreferences, moshi: Moshi) { private val sourcesType = Types.newParameterizedType(List::class.java, TleSource::class.java) private val sourcesAdapter = moshi.adapter>(sourcesType) @@ -36,16 +34,11 @@ class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi companion object { const val keySources = "sourcesListJson" const val keyModes = "satModes" - const val keyLatitude = "latitude" - const val keyLongitude = "longitude" - const val keyAltitude = "altitude" const val keyCompass = "compass" const val keyTextLabels = "shouldUseTextLabels" const val keyTimeUTC = "timeUTC" const val keyHoursAhead = "hoursAhead" const val keyMinElevation = "minElevation" - const val keyPositionGPS = "setPositionGPS" - const val keyPositionQTH = "setPositionQTH" const val keyIsFirstLaunch = "shouldShowSplash" const val keyRotator = "isRotatorEnabled" const val keyRotatorAddress = "rotatorAddress" @@ -59,30 +52,6 @@ class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi fun getMinElevation(): Double { return preferences.getInt(keyMinElevation, 16).toDouble() } - - fun getStationPosition(): StationPosition { - val defaultGSP = "0.0" - val latitude = preferences.getString(keyLatitude, null) ?: defaultGSP - val longitude = preferences.getString(keyLongitude, null) ?: defaultGSP - val altitude = preferences.getString(keyAltitude, null) ?: defaultGSP - return StationPosition(latitude.toDouble(), longitude.toDouble(), altitude.toDouble()) - } - - fun setStationPosition(latitude: Double, longitude: Double, altitude: Double) { - preferences.edit { - putString(keyLatitude, latitude.toString()) - putString(keyLongitude, longitude.toString()) - putString(keyAltitude, altitude.toString()) - } - } - - fun getMagDeclination(): Float { - val stationPosition = getStationPosition() - val lat = stationPosition.latitude.toFloat() - val lon = stationPosition.longitude.toFloat() - val alt = stationPosition.altitude.toFloat() - return GeomagneticField(lat, lon, alt, System.currentTimeMillis()).declination - } fun shouldUseTextLabels(): Boolean { return preferences.getBoolean(keyTextLabels, false) diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt index 617ac994..a9dde316 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt @@ -23,7 +23,7 @@ import androidx.room.TypeConverters import com.rtbishop.look4sat.framework.model.SatEntry import com.rtbishop.look4sat.framework.model.SatTrans -@Database(entities = [SatEntry::class, SatTrans::class], version = 1) +@Database(entities = [SatEntry::class, SatTrans::class], version = 1, exportSchema = false) @TypeConverters(RoomConverters::class) abstract class SatelliteDb : RoomDatabase() { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt index f6b32020..7a7b10ce 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt @@ -17,6 +17,7 @@ */ package com.rtbishop.look4sat.presentation +import android.annotation.SuppressLint import android.content.pm.ActivityInfo import android.os.Bundle import androidx.appcompat.app.AppCompatActivity @@ -24,16 +25,18 @@ import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.ActivityMainBinding -import com.rtbishop.look4sat.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager +import com.rtbishop.look4sat.utility.navigateSafe import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint class Look4SatActivity : AppCompatActivity() { - + @Inject lateinit var prefsManager: PrefsManager - + + @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT setTheme(R.style.AppTheme) @@ -44,7 +47,7 @@ class Look4SatActivity : AppCompatActivity() { binding.navBottom.setupWithNavController(navHost.navController) if (prefsManager.isFirstLaunch()) { prefsManager.setFirstLaunchDone() - navHost.navController.navigate(R.id.nav_dialog_splash) + navHost.navController.navigateSafe(R.id.nav_dialog_splash) } } } 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 dcc8d1d5..c71bc397 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 @@ -32,7 +32,7 @@ import com.rtbishop.look4sat.interactors.GetSatItems import com.rtbishop.look4sat.interactors.ImportDataFromStream import com.rtbishop.look4sat.interactors.ImportDataFromWeb import com.rtbishop.look4sat.interactors.UpdateEntriesSelection -import com.rtbishop.look4sat.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch @@ -156,8 +156,8 @@ class EntriesViewModel @Inject constructor( items.filter { it.catNum == query.toInt() } } catch (e: Exception) { items.filter { item -> - val itemName = item.name.toLowerCase(Locale.getDefault()) - itemName.contains(query.toLowerCase(Locale.getDefault())) + val itemName = item.name.lowercase(Locale.getDefault()) + itemName.contains(query.lowercase(Locale.getDefault())) } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt index 027c5ea9..7bd2b32e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt @@ -17,6 +17,7 @@ */ package com.rtbishop.look4sat.presentation.mapScreen +import android.content.SharedPreferences import android.graphics.Color import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter @@ -40,10 +41,14 @@ import org.osmdroid.views.MapView import org.osmdroid.views.overlay.* import timber.log.Timber import java.util.* +import javax.inject.Inject @AndroidEntryPoint class MapFragment : Fragment(R.layout.fragment_map) { + @Inject + lateinit var sharedPreferences: SharedPreferences + private val viewModel: MapViewModel by viewModels() private val minLat = MapView.getTileSystem().minLatitude private val maxLat = MapView.getTileSystem().maxLatitude @@ -63,7 +68,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Configuration.getInstance().load(requireContext(), viewModel.getPreferences()) + Configuration.getInstance().load(requireContext(), sharedPreferences) val binding = FragmentMapBinding.bind(view).apply { mapView.apply { setMultiTouchControls(true) @@ -183,7 +188,8 @@ class MapFragment : Fragment(R.layout.fragment_map) { private fun renderSatData(satData: SatData, binding: FragmentMapBinding) { binding.apply { - idName.text = String.format(getString(R.string.pat_osm_idName), satData.catNum, satData.name) + idName.text = + String.format(getString(R.string.pat_osm_idName), satData.catNum, satData.name) qthLocator.text = String.format(getString(R.string.map_qth), satData.qthLoc) altitude.text = String.format(getString(R.string.pat_altitude), satData.altitude) distance.text = String.format(getString(R.string.pat_distance), satData.range) 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 63d28357..cdec0fbb 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 @@ -17,16 +17,15 @@ */ package com.rtbishop.look4sat.presentation.mapScreen -import android.content.SharedPreferences import androidx.lifecycle.* +import com.rtbishop.look4sat.data.LocationRepo import com.rtbishop.look4sat.di.DefaultDispatcher import com.rtbishop.look4sat.domain.predict4kotlin.Position -import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter import com.rtbishop.look4sat.domain.predict4kotlin.Satellite import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition import com.rtbishop.look4sat.framework.model.SatData import com.rtbishop.look4sat.interactors.GetSelectedSatellites -import com.rtbishop.look4sat.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* import java.util.* @@ -40,11 +39,11 @@ import kotlin.math.sqrt class MapViewModel @Inject constructor( private val getSelectedSatellites: GetSelectedSatellites, private val prefsManager: PrefsManager, - private val qthConverter: QthConverter, + private val locationRepo: LocationRepo, @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher ) : ViewModel() { - private val gsp = prefsManager.getStationPosition() + private val gsp = locationRepo.getStationPosition() private var dataUpdateJob: Job? = null private var allSatList = listOf() private lateinit var selectedSat: Satellite @@ -78,10 +77,6 @@ class MapViewModel @Inject constructor( } } - fun getPreferences(): SharedPreferences { - return prefsManager.preferences - } - fun shouldUseTextLabels(): Boolean { return prefsManager.shouldUseTextLabels() } @@ -177,7 +172,7 @@ class MapViewModel @Inject constructor( val osmLat = getOsmLat(Math.toDegrees(satPos.latitude)) val osmLon = getOsmLon(Math.toDegrees(satPos.longitude)) val osmPos = Position(osmLat, osmLon) - val qthLoc = qthConverter.positionToQTH(osmPos.latitude, osmPos.longitude) ?: "-- --" + val qthLoc = locationRepo.positionToQTH(osmPos.latitude, osmPos.longitude) ?: "-- --" val velocity = getOrbitalVelocity(satPos.altitude) val satData = SatData( sat, sat.tle.catnum, sat.tle.name, satPos.range, 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 51f3cf88..b34fe443 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 @@ -25,7 +25,7 @@ import com.rtbishop.look4sat.framework.model.Result import com.rtbishop.look4sat.utility.PassesRepo import com.rtbishop.look4sat.interactors.GetSelectedSatellites import com.rtbishop.look4sat.domain.predict4kotlin.SatPass -import com.rtbishop.look4sat.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* import kotlinx.coroutines.flow.collect diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt index 20d9ca6d..3ff3b2c4 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt @@ -18,13 +18,14 @@ package com.rtbishop.look4sat.presentation.polarScreen import androidx.lifecycle.* +import com.rtbishop.look4sat.data.LocationRepo import com.rtbishop.look4sat.di.IoDispatcher import com.rtbishop.look4sat.domain.model.SatTrans import com.rtbishop.look4sat.domain.predict4kotlin.SatPass import com.rtbishop.look4sat.interactors.GetTransmittersForSat -import com.rtbishop.look4sat.utility.OrientationProvider +import com.rtbishop.look4sat.framework.OrientationProvider import com.rtbishop.look4sat.utility.PassesRepo -import com.rtbishop.look4sat.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager import com.rtbishop.look4sat.utility.round import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* @@ -36,6 +37,7 @@ import javax.inject.Inject @HiltViewModel class PolarViewModel @Inject constructor( + private val locationRepo: LocationRepo, private val orientationProvider: OrientationProvider, private val prefsManager: PrefsManager, private val passesRepo: PassesRepo, @@ -68,7 +70,7 @@ class PolarViewModel @Inject constructor( } override fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float) { - _orientation.value = Triple(azimuth + prefsManager.getMagDeclination(), pitch, roll) + _orientation.value = Triple(azimuth + locationRepo.getMagDeclination(), pitch, roll) } private fun initRotatorControl(satPass: SatPass) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt index f561e0f0..d431f1d1 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt @@ -19,7 +19,6 @@ package com.rtbishop.look4sat.presentation.prefsScreen import android.Manifest import android.content.pm.PackageManager -import android.location.LocationManager import android.os.Bundle import android.text.InputType import android.util.Patterns @@ -31,9 +30,9 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.snackbar.Snackbar import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.utility.PrefsManager -import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter -import com.rtbishop.look4sat.utility.round +import com.rtbishop.look4sat.data.LocationRepo +import com.rtbishop.look4sat.framework.DefaultLocationSource +import com.rtbishop.look4sat.framework.PrefsManager import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -41,16 +40,15 @@ import javax.inject.Inject class PrefsFragment : PreferenceFragmentCompat() { @Inject - lateinit var locationManager: LocationManager + lateinit var locationRepo: LocationRepo + @Inject lateinit var prefsManager: PrefsManager - @Inject - lateinit var qthConverter: QthConverter private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> if (isGranted) { - setPositionFromGPS() + updatePositionFromGPS() } else { showSnack(getString(R.string.pref_pos_gps_error)) } @@ -63,16 +61,16 @@ class PrefsFragment : PreferenceFragmentCompat() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - findPreference(PrefsManager.keyPositionGPS)?.apply { + findPreference(DefaultLocationSource.keyPositionGPS)?.apply { setOnPreferenceClickListener { - setPositionFromGPS() + updatePositionFromGPS() return@setOnPreferenceClickListener true } } - findPreference(PrefsManager.keyPositionQTH)?.apply { + findPreference(DefaultLocationSource.keyPositionQTH)?.apply { setOnPreferenceChangeListener { _, newValue -> - setPositionFromQth(newValue.toString()) + updatePositionFromQth(newValue.toString()) } } @@ -101,34 +99,29 @@ class PrefsFragment : PreferenceFragmentCompat() { } } - private fun setPositionFromQth(qthString: String): Boolean { - qthConverter.qthToPosition(qthString)?.let { gsp -> - prefsManager.setStationPosition(gsp.latitude, gsp.longitude, 0.0) + private fun updatePositionFromQth(qthString: String): Boolean { + return if (locationRepo.updatePositionFromQTH(qthString)) { showSnack(getString(R.string.pref_pos_success)) - return true + true + } else { + showSnack(getString(R.string.pref_pos_qth_error)) + false } - showSnack(getString(R.string.pref_pos_qth_error)) - return false } - private fun setPositionFromGPS() { + private fun updatePositionFromGPS() { val locPermString = Manifest.permission.ACCESS_FINE_LOCATION val locPermResult = ContextCompat.checkSelfPermission(requireContext(), locPermString) if (locPermResult == PackageManager.PERMISSION_GRANTED) { - val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER) - if (location != null) { - val latitude = location.latitude.round(4) - val longitude = location.longitude.round(4) - val altitude = location.altitude.round(1) - prefsManager.setStationPosition(latitude, longitude, altitude) + if (locationRepo.updatePositionFromGPS()) { showSnack(getString(R.string.pref_pos_success)) } else showSnack(getString(R.string.pref_pos_gps_null)) } else requestPermissionLauncher.launch(locPermString) } private fun showSnack(message: String) { - Snackbar.make(requireView(), message, Snackbar.LENGTH_SHORT) - .setAnchorView(R.id.nav_bottom) - .show() + Snackbar.make(requireView(), message, Snackbar.LENGTH_SHORT).apply { + setAnchorView(R.id.nav_bottom) + }.show() } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesDialog/SourcesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesDialog/SourcesDialog.kt index 99e8853d..5bfe5b47 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesDialog/SourcesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesDialog/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.utility.PrefsManager +import com.rtbishop.look4sat.framework.PrefsManager import com.rtbishop.look4sat.databinding.DialogSourcesBinding import com.rtbishop.look4sat.utility.setNavResult import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/java/com/rtbishop/look4sat/utility/PassesRepo.kt b/app/src/main/java/com/rtbishop/look4sat/utility/PassesRepo.kt index 3ae36217..3dc46f3e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/utility/PassesRepo.kt +++ b/app/src/main/java/com/rtbishop/look4sat/utility/PassesRepo.kt @@ -17,9 +17,11 @@ */ package com.rtbishop.look4sat.utility +import com.rtbishop.look4sat.data.LocationRepo import com.rtbishop.look4sat.di.DefaultDispatcher import com.rtbishop.look4sat.domain.predict4kotlin.SatPass import com.rtbishop.look4sat.domain.predict4kotlin.Satellite +import com.rtbishop.look4sat.framework.PrefsManager import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow @@ -30,6 +32,7 @@ import javax.inject.Singleton @Singleton class PassesRepo @Inject constructor( + private val locationRepo: LocationRepo, private val prefsManager: PrefsManager, @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher ) { @@ -61,7 +64,7 @@ class PassesRepo @Inject constructor( } private fun getPasses(satellite: Satellite, refDate: Date): List { - val predictor = satellite.getPredictor(prefsManager.getStationPosition()) + val predictor = satellite.getPredictor(locationRepo.getStationPosition()) return predictor.getPasses(refDate, prefsManager.getHoursAhead(), true) } diff --git a/core/src/main/java/com/rtbishop/look4sat/data/LocationRepo.kt b/core/src/main/java/com/rtbishop/look4sat/data/LocationRepo.kt new file mode 100644 index 00000000..92a6328a --- /dev/null +++ b/core/src/main/java/com/rtbishop/look4sat/data/LocationRepo.kt @@ -0,0 +1,35 @@ +package com.rtbishop.look4sat.data + +import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter +import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition + +class LocationRepo( + private val locationSource: LocationSource, + private val qthConverter: QthConverter +) { + + fun getStationPosition(): StationPosition { + return locationSource.loadStationPosition() + } + + fun getMagDeclination(): Float { + return locationSource.getMagDeclination(getStationPosition()) + } + + fun positionToQTH(lat: Double, lon: Double): String? { + return qthConverter.positionToQTH(lat, lon) + } + + fun updatePositionFromGPS(): Boolean { + val stationPosition = locationSource.getLastKnownLocation() ?: return false + locationSource.saveStationPosition(stationPosition) + return true + } + + fun updatePositionFromQTH(qthString: String): Boolean { + val position = qthConverter.qthToPosition(qthString) ?: return false + val stationPosition = StationPosition(position.latitude, position.longitude, 0.0) + locationSource.saveStationPosition(stationPosition) + return true + } +} diff --git a/core/src/main/java/com/rtbishop/look4sat/data/LocationSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/LocationSource.kt new file mode 100644 index 00000000..0e14be6f --- /dev/null +++ b/core/src/main/java/com/rtbishop/look4sat/data/LocationSource.kt @@ -0,0 +1,14 @@ +package com.rtbishop.look4sat.data + +import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition + +interface LocationSource { + + fun getLastKnownLocation(): StationPosition? + + fun getMagDeclination(position: StationPosition): Float + + fun loadStationPosition(): StationPosition + + fun saveStationPosition(position: StationPosition) +} \ No newline at end of file diff --git a/core/src/main/java/com/rtbishop/look4sat/data/DefaultSatelliteRepo.kt b/core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt similarity index 80% rename from core/src/main/java/com/rtbishop/look4sat/data/DefaultSatelliteRepo.kt rename to core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt index 3c2de37d..9ea3e267 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/DefaultSatelliteRepo.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt @@ -1,6 +1,5 @@ package com.rtbishop.look4sat.data -import com.rtbishop.look4sat.domain.SatelliteRepo import com.rtbishop.look4sat.domain.model.SatEntry import com.rtbishop.look4sat.domain.model.SatItem import com.rtbishop.look4sat.domain.model.SatTrans @@ -13,30 +12,30 @@ import kotlinx.coroutines.withContext import java.io.InputStream import java.util.zip.ZipInputStream -class DefaultSatelliteRepo( +class SatelliteRepo( private val localSource: LocalDataSource, private val remoteSource: RemoteDataSource, private val ioDispatcher: CoroutineDispatcher -) : SatelliteRepo { +) { - override fun getSatItems(): Flow> { + fun getSatItems(): Flow> { return localSource.getSatItems() } - override fun getTransmittersForSat(catNum: Int): Flow> { + fun getTransmittersForSat(catNum: Int): Flow> { return localSource.getTransmittersForSat(catNum) } - override suspend fun getSelectedSatellites(): List { + suspend fun getSelectedSatellites(): List { return localSource.getSelectedSatellites() } - override suspend fun importDataFromStream(stream: InputStream) = withContext(ioDispatcher) { + suspend fun importDataFromStream(stream: InputStream) = withContext(ioDispatcher) { val importedEntries = Satellite.importElements(stream).map { tle -> SatEntry(tle) } localSource.updateEntries(importedEntries) } - override suspend fun importDataFromWeb(sources: List) { + suspend fun importDataFromWeb(sources: List) { coroutineScope { launch(ioDispatcher) { val importedEntries = mutableListOf() @@ -64,7 +63,7 @@ class DefaultSatelliteRepo( } } - override suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { + suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { localSource.updateEntriesSelection(catNums, isSelected) } } diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/SatelliteRepo.kt b/core/src/main/java/com/rtbishop/look4sat/domain/SatelliteRepo.kt deleted file mode 100644 index dff9cb63..00000000 --- a/core/src/main/java/com/rtbishop/look4sat/domain/SatelliteRepo.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.rtbishop.look4sat.domain - -import com.rtbishop.look4sat.domain.model.SatItem -import com.rtbishop.look4sat.domain.model.SatTrans -import com.rtbishop.look4sat.domain.predict4kotlin.Satellite -import kotlinx.coroutines.flow.Flow -import java.io.InputStream - -interface SatelliteRepo { - - fun getSatItems(): Flow> - - fun getTransmittersForSat(catNum: Int): Flow> - - suspend fun getSelectedSatellites(): List - - suspend fun importDataFromStream(stream: InputStream) - - suspend fun importDataFromWeb(sources: List) - - suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) -} diff --git a/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/QthConverter.kt b/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/QthConverter.kt index 39a9cfa3..4cfbae05 100644 --- a/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/QthConverter.kt +++ b/core/src/main/java/com/rtbishop/look4sat/domain/predict4kotlin/QthConverter.kt @@ -24,12 +24,12 @@ class QthConverter { fun qthToPosition(qthString: String): Position? { val trimmedQth = qthString.take(6) if (!isValidQTH(trimmedQth)) return null - val lonFirst = (trimmedQth[0].toUpperCase().toInt() - 65) * 20 - val latFirst = (trimmedQth[1].toUpperCase().toInt() - 65) * 10 + val lonFirst = (trimmedQth[0].uppercaseChar().code - 65) * 20 + val latFirst = (trimmedQth[1].uppercaseChar().code - 65) * 10 val lonSecond = trimmedQth[2].toString().toInt() * 2 val latSecond = trimmedQth[3].toString().toInt() - val lonThird = (((trimmedQth[4].toLowerCase().toInt() - 97) / 12.0) + (1.0 / 24.0)) - 180 - val latThird = (((trimmedQth[5].toLowerCase().toInt() - 97) / 24.0) + (1.0 / 48.0)) - 90 + val lonThird = (((trimmedQth[4].lowercaseChar().code - 97) / 12.0) + (1.0 / 24.0)) - 180 + val latThird = (((trimmedQth[5].lowercaseChar().code - 97) / 24.0) + (1.0 / 48.0)) - 90 val longitude = (lonFirst + lonSecond + lonThird).roundToDecimals(4) val latitude = (latFirst + latSecond + latThird).roundToDecimals(4) return Position(latitude, longitude) diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/GetSatItems.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/GetSatItems.kt index 6a053de9..2a38fb70 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/GetSatItems.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/GetSatItems.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo import com.rtbishop.look4sat.domain.model.SatItem import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/GetSelectedSatellites.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/GetSelectedSatellites.kt index 58638138..fb4966b1 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/GetSelectedSatellites.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/GetSelectedSatellites.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo import com.rtbishop.look4sat.domain.predict4kotlin.Satellite class GetSelectedSatellites(private val satelliteRepo: SatelliteRepo) { diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/GetTransmittersForSat.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/GetTransmittersForSat.kt index 87862853..80373fad 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/GetTransmittersForSat.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/GetTransmittersForSat.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo import com.rtbishop.look4sat.domain.model.SatTrans import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromStream.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromStream.kt index 68f51fea..19a203f7 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromStream.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromStream.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo import java.io.InputStream class ImportDataFromStream(private val satelliteRepo: SatelliteRepo) { diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromWeb.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromWeb.kt index 9e19afa0..b61ac5f6 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromWeb.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/ImportDataFromWeb.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo class ImportDataFromWeb(private val satelliteRepo: SatelliteRepo) { diff --git a/core/src/main/java/com/rtbishop/look4sat/interactors/UpdateEntriesSelection.kt b/core/src/main/java/com/rtbishop/look4sat/interactors/UpdateEntriesSelection.kt index 33dce2fb..64266dcf 100644 --- a/core/src/main/java/com/rtbishop/look4sat/interactors/UpdateEntriesSelection.kt +++ b/core/src/main/java/com/rtbishop/look4sat/interactors/UpdateEntriesSelection.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.interactors -import com.rtbishop.look4sat.domain.SatelliteRepo +import com.rtbishop.look4sat.data.SatelliteRepo class UpdateEntriesSelection(private val satelliteRepo: SatelliteRepo) { diff --git a/core/src/test/java/com/rtbishop/look4sat/QthConverterTest.kt b/core/src/test/java/com/rtbishop/look4sat/QthConverterTest.kt index ee3b44ef..28c3d140 100644 --- a/core/src/test/java/com/rtbishop/look4sat/QthConverterTest.kt +++ b/core/src/test/java/com/rtbishop/look4sat/QthConverterTest.kt @@ -21,40 +21,40 @@ import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter import org.junit.Test class QthConverterTest { - - private val converter = QthConverter() - + + private val qthConverter = QthConverter() + @Test - fun `Given valid QTH returns correct location`() { - var result = converter.qthToPosition("io91VL39FX") + fun `Given valid QTH returns correct POS`() { + var result = qthConverter.qthToPosition("io91VL39FX") assert(result?.latitude == 51.4792 && result.longitude == -0.2083) - result = converter.qthToPosition("JN58TD") + result = qthConverter.qthToPosition("JN58TD") assert(result?.latitude == 48.1458 && result.longitude == 11.6250) - result = converter.qthToPosition("gf15vc") + result = qthConverter.qthToPosition("gf15vc") assert(result?.latitude == -34.8958 && result.longitude == -56.2083) - result = converter.qthToPosition("fm18LW") + result = qthConverter.qthToPosition("fm18LW") assert(result?.latitude == 38.9375 && result.longitude == -77.0417) } - + @Test fun `Given invalid QTH returns null`() { - var result = converter.qthToPosition("ZZ00zz") + var result = qthConverter.qthToPosition("ZZ00zz") assert(result == null) - result = converter.qthToPosition("JN58tz") + result = qthConverter.qthToPosition("JN58tz") assert(result == null) } - + @Test - fun `Given valid location returns correct QTH`() { - assert(converter.positionToQTH(51.4878, -0.2146) == "IO91vl") - assert(converter.positionToQTH(48.1466, 11.6083) == "JN58td") - assert(converter.positionToQTH(-34.91, -56.2116) == "GF15vc") - assert(converter.positionToQTH(38.92, -77.065) == "FM18lw") + fun `Given valid POS returns correct QTH`() { + assert(qthConverter.positionToQTH(51.4878, -0.2146) == "IO91vl") + assert(qthConverter.positionToQTH(48.1466, 11.6083) == "JN58td") + assert(qthConverter.positionToQTH(-34.91, -56.2116) == "GF15vc") + assert(qthConverter.positionToQTH(38.92, -77.065) == "FM18lw") } @Test fun `Given invalid location returns null`() { - assert(converter.positionToQTH(91.0542, -170.1142) == null) - assert(converter.positionToQTH(89.0542, -240.1142) == null) + assert(qthConverter.positionToQTH(91.0542, -170.1142) == null) + assert(qthConverter.positionToQTH(89.0542, -240.1142) == null) } }