diff --git a/app/schemas/com.rtbishop.look4sat.framework.data.LocalDatabase/1.json b/app/schemas/com.rtbishop.look4sat.framework.data.MainDatabase/1.json
similarity index 100%
rename from app/schemas/com.rtbishop.look4sat.framework.data.LocalDatabase/1.json
rename to app/schemas/com.rtbishop.look4sat.framework.data.MainDatabase/1.json
diff --git a/app/schemas/com.rtbishop.look4sat.framework.data.LocalDatabase/2.json b/app/schemas/com.rtbishop.look4sat.framework.data.MainDatabase/2.json
similarity index 98%
rename from app/schemas/com.rtbishop.look4sat.framework.data.LocalDatabase/2.json
rename to app/schemas/com.rtbishop.look4sat.framework.data.MainDatabase/2.json
index ddac2a28..1213ef47 100644
--- a/app/schemas/com.rtbishop.look4sat.framework.data.LocalDatabase/2.json
+++ b/app/schemas/com.rtbishop.look4sat.framework.data.MainDatabase/2.json
@@ -118,10 +118,10 @@
}
],
"primaryKey": {
+ "autoGenerate": false,
"columnNames": [
"catnum"
- ],
- "autoGenerate": false
+ ]
},
"indices": [],
"foreignKeys": []
@@ -186,10 +186,10 @@
}
],
"primaryKey": {
+ "autoGenerate": false,
"columnNames": [
"uuid"
- ],
- "autoGenerate": false
+ ]
},
"indices": [],
"foreignKeys": []
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 45364ace..95921e4a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,7 +12,7 @@
diff --git a/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt
new file mode 100644
index 00000000..11c16578
--- /dev/null
+++ b/app/src/main/java/com/rtbishop/look4sat/MainActivity.kt
@@ -0,0 +1,47 @@
+/*
+ * Look4Sat. Amateur radio satellite tracker and pass predictor.
+ * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.rtbishop.look4sat
+
+import android.content.Context
+import android.content.pm.ActivityInfo
+import android.content.res.Configuration
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
+import com.rtbishop.look4sat.presentation.MainScreen
+import com.rtbishop.look4sat.presentation.MainTheme
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class MainActivity : ComponentActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+ installSplashScreen()
+ super.onCreate(savedInstanceState)
+ setContent { MainTheme { MainScreen() } }
+ }
+
+ override fun attachBaseContext(newBase: Context?) {
+ val newConfig = Configuration(newBase?.resources?.configuration)
+ newConfig.fontScale = 1.0f
+ applyOverrideConfiguration(newConfig)
+ super.attachBaseContext(newBase)
+ }
+}
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt b/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt
similarity index 82%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt
rename to app/src/main/java/com/rtbishop/look4sat/MainApplication.kt
index 0bef3410..7ef73f5c 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainApplication.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/MainApplication.kt
@@ -15,12 +15,11 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.presentation
+package com.rtbishop.look4sat
import android.app.Application
-import com.rtbishop.look4sat.BuildConfig
import com.rtbishop.look4sat.domain.IDataRepository
-import com.rtbishop.look4sat.framework.SettingsManager
+import com.rtbishop.look4sat.domain.ISettingsSource
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
import java.text.SimpleDateFormat
@@ -31,10 +30,10 @@ import javax.inject.Inject
class MainApplication : Application() {
@Inject
- lateinit var repository: IDataRepository
+ lateinit var dataRepository: IDataRepository
@Inject
- lateinit var settingsManager: SettingsManager
+ lateinit var settingsSource: ISettingsSource
override fun onCreate() {
super.onCreate()
@@ -45,12 +44,12 @@ class MainApplication : Application() {
}
private fun checkAutoUpdate() {
- if (settingsManager.isUpdateEnabled()) {
- val timeDelta = System.currentTimeMillis() - settingsManager.getLastUpdateTime()
+ if (settingsSource.isUpdateEnabled()) {
+ val timeDelta = System.currentTimeMillis() - settingsSource.getLastUpdateTime()
if (timeDelta > 172800000) { // 48 hours in ms
val sdf = SimpleDateFormat("d MMM yyyy - HH:mm:ss", Locale.getDefault())
Timber.d("Started periodic data update on ${sdf.format(Date())}")
- repository.updateFromWeb()
+ dataRepository.updateFromWeb()
}
}
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/MainModule.kt b/app/src/main/java/com/rtbishop/look4sat/MainModule.kt
new file mode 100644
index 00000000..553d627f
--- /dev/null
+++ b/app/src/main/java/com/rtbishop/look4sat/MainModule.kt
@@ -0,0 +1,102 @@
+/*
+ * Look4Sat. Amateur radio satellite tracker and pass predictor.
+ * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.rtbishop.look4sat
+
+import android.bluetooth.BluetoothManager
+import android.content.Context
+import android.hardware.Sensor
+import android.hardware.SensorManager
+import android.location.LocationManager
+import androidx.room.Room
+import com.rtbishop.look4sat.data.DataParser
+import com.rtbishop.look4sat.data.DataRepository
+import com.rtbishop.look4sat.domain.*
+import com.rtbishop.look4sat.framework.*
+import com.rtbishop.look4sat.framework.data.*
+import com.rtbishop.look4sat.framework.data.local.EntriesStorage
+import com.rtbishop.look4sat.framework.data.local.RadiosStorage
+import com.rtbishop.look4sat.framework.data.remote.FileSource
+import com.rtbishop.look4sat.framework.data.remote.NetworkSource
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object MainModule {
+
+ @Provides
+ @Singleton
+ fun provideBluetoothReporter(@ApplicationContext context: Context): BluetoothReporter {
+ val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
+ return BluetoothReporter(manager, CoroutineScope(Dispatchers.IO))
+ }
+
+ @Provides
+ @Singleton
+ fun provideNetworkReporter(): NetworkReporter = NetworkReporter(CoroutineScope(Dispatchers.IO))
+
+ @Provides
+ @Singleton
+ fun provideDataRepository(
+ @ApplicationContext context: Context, settings: ISettingsSource
+ ): IDataRepository {
+ val db = Room.databaseBuilder(context, MainDatabase::class.java, "Look4SatDb")
+ .addMigrations(MIGRATION_1_2).fallbackToDestructiveMigration().build()
+ val parser = DataParser(Dispatchers.Default)
+ val fileSource = FileSource(context.contentResolver, Dispatchers.IO)
+ val entries = EntriesStorage(db.entriesDao())
+ val radios = RadiosStorage(db.radiosDao())
+ val remoteSource = NetworkSource(Dispatchers.IO)
+ val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
+ return DataRepository(parser, fileSource, entries, radios, remoteSource, scope, settings)
+ }
+
+ @Provides
+ @Singleton
+ fun provideLocationSource(
+ @ApplicationContext context: Context, settings: ISettingsSource
+ ): ILocationSource {
+ val manager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
+ return LocationSource(manager, settings)
+ }
+
+ @Provides
+ @Singleton
+ fun provideOrientationSource(@ApplicationContext context: Context): OrientationSource {
+ val manager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
+ val sensor = manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
+ return OrientationSource(manager, sensor)
+ }
+
+ @Provides
+ @Singleton
+ fun provideSatelliteManager(): ISatelliteManager = SatelliteManager(Dispatchers.Default)
+
+ @Provides
+ @Singleton
+ fun provideSettingsSource(@ApplicationContext context: Context): ISettingsSource {
+ return SettingsSource(context.getSharedPreferences("default", Context.MODE_PRIVATE))
+ }
+}
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/BTReporter.kt b/app/src/main/java/com/rtbishop/look4sat/framework/BluetoothReporter.kt
similarity index 95%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/BTReporter.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/BluetoothReporter.kt
index e08217ec..6b075bb0 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/BTReporter.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/BluetoothReporter.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.radarScreen
+package com.rtbishop.look4sat.framework
import android.bluetooth.BluetoothManager
import android.util.Log
@@ -9,7 +9,10 @@ import java.io.OutputStream
import java.util.*
import kotlin.math.abs
-class BTReporter(private val manager: BluetoothManager, private val reporterScope: CoroutineScope) {
+class BluetoothReporter(
+ private val manager: BluetoothManager,
+ private val reporterScope: CoroutineScope
+) {
private val tag = "BTReporter"
private val sppid: UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb")
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt
deleted file mode 100644
index 6165edcd..00000000
--- a/app/src/main/java/com/rtbishop/look4sat/framework/LocationManager.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Look4Sat. Amateur radio satellite tracker and pass predictor.
- * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.rtbishop.look4sat.framework
-
-import android.Manifest
-import android.content.Context
-import android.content.pm.PackageManager
-import android.location.Location
-import android.location.LocationListener
-import android.location.LocationManager
-import android.os.Bundle
-import androidx.core.content.ContextCompat
-import com.rtbishop.look4sat.R
-import com.rtbishop.look4sat.domain.ILocationManager
-import com.rtbishop.look4sat.domain.ISettingsManager
-import com.rtbishop.look4sat.domain.model.DataState
-import com.rtbishop.look4sat.domain.predict.GeoPos
-import com.rtbishop.look4sat.utility.QthConverter
-import com.rtbishop.look4sat.utility.round
-import dagger.hilt.android.qualifiers.ApplicationContext
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
-import javax.inject.Inject
-import javax.inject.Singleton
-
-@Singleton
-class LocationManager @Inject constructor(
- @ApplicationContext private val context: Context,
- private val manager: LocationManager,
- private val settings: ISettingsManager,
-) : LocationListener, ILocationManager {
-
- private val providerDef = LocationManager.PASSIVE_PROVIDER
- private val providerNet = LocationManager.NETWORK_PROVIDER
- private val providerGps = LocationManager.GPS_PROVIDER
- private val locationCoarse = Manifest.permission.ACCESS_COARSE_LOCATION
- private val locationFine = Manifest.permission.ACCESS_FINE_LOCATION
- private val _stationPosition = MutableStateFlow>(DataState.Handled)
- private var currentLocator = settings.loadStationLocator()
- private var currentPosition = settings.loadStationPosition()
-
- override val stationPosition: StateFlow> = _stationPosition
-
- override fun getStationLocator(): String = currentLocator
-
- override fun getStationPosition(): GeoPos = currentPosition
-
- override fun setStationPosition(latitude: Double, longitude: Double) {
- if (QthConverter.isValidPosition(latitude, longitude)) {
- val tempLon = if (longitude > 180.0) longitude - 180 else longitude
- val newLat = latitude.round(4)
- val newLon = tempLon.round(4)
- QthConverter.positionToQth(newLat, newLon)?.let { locator ->
- currentLocator = locator
- currentPosition = GeoPos(newLat, newLon)
- settings.saveStationLocator(locator)
- settings.saveStationPosition(currentPosition)
- _stationPosition.value = DataState.Success(currentPosition)
- }
- } else {
- _stationPosition.value =
- DataState.Error(context.getString(R.string.location_manual_error))
- }
- }
-
- override fun setPositionFromGps() {
- val result = ContextCompat.checkSelfPermission(context, locationFine)
- if (manager.isProviderEnabled(providerGps) && result == PackageManager.PERMISSION_GRANTED) {
- val location = manager.getLastKnownLocation(providerDef)
- if (location != null) {
- setStationPosition(location.latitude, location.longitude)
- } else {
- _stationPosition.value = DataState.Loading
- manager.requestLocationUpdates(providerGps, 0L, 0f, this)
- }
- } else {
- _stationPosition.value = DataState.Error(context.getString(R.string.location_null))
- }
- }
-
- override fun setPositionFromNet() {
- val result = ContextCompat.checkSelfPermission(context, locationCoarse)
- if (manager.isProviderEnabled(providerNet) && result == PackageManager.PERMISSION_GRANTED) {
- val location = manager.getLastKnownLocation(providerDef)
- if (location != null) {
- setStationPosition(location.latitude, location.longitude)
- } else {
- _stationPosition.value = DataState.Loading
- manager.requestLocationUpdates(providerNet, 0L, 0f, this)
- }
- } else {
- _stationPosition.value = DataState.Error(context.getString(R.string.location_null))
- }
- }
-
- override fun setPositionFromQth(locator: String) {
- val position = QthConverter.qthToPosition(locator)
- if (position != null) {
- currentLocator = locator
- currentPosition = position
- settings.saveStationLocator(locator)
- settings.saveStationPosition(currentPosition)
- _stationPosition.value = DataState.Success(currentPosition)
- } else {
- _stationPosition.value = DataState.Error(context.getString(R.string.location_qth_error))
- }
- }
-
- override fun setPositionHandled() {
- _stationPosition.value = DataState.Handled
- }
-
- override fun onLocationChanged(location: Location) {
- manager.removeUpdates(this)
- setStationPosition(location.latitude, location.longitude)
- }
-
- override fun onProviderEnabled(provider: String) {}
-
- override fun onProviderDisabled(provider: String) {}
-
- @Deprecated("Deprecated in Java")
- override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
-}
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/LocationSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/LocationSource.kt
new file mode 100644
index 00000000..bbb0f854
--- /dev/null
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/LocationSource.kt
@@ -0,0 +1,87 @@
+/*
+ * Look4Sat. Amateur radio satellite tracker and pass predictor.
+ * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.rtbishop.look4sat.framework
+
+import android.location.Location
+import android.location.LocationManager
+import androidx.core.location.LocationListenerCompat
+import androidx.core.location.LocationManagerCompat
+import com.rtbishop.look4sat.domain.ILocationSource
+import com.rtbishop.look4sat.domain.ISettingsSource
+import com.rtbishop.look4sat.model.StationPos
+import com.rtbishop.look4sat.utility.QthConverter
+import com.rtbishop.look4sat.utility.round
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import timber.log.Timber
+
+class LocationSource(
+ private val manager: LocationManager,
+ private val settings: ISettingsSource,
+) : ILocationSource, LocationListenerCompat {
+
+ private val _stationPosition = MutableStateFlow(settings.loadStationPosition())
+ override val stationPosition: StateFlow = _stationPosition
+
+ override fun setGpsPosition(): Boolean {
+ if (!LocationManagerCompat.isLocationEnabled(manager)) return false
+ forceLocationUpdate(LocationManager.GPS_PROVIDER)
+ forceLocationUpdate(LocationManager.NETWORK_PROVIDER)
+ return true
+ }
+
+ override fun setGeoPosition(latitude: Double, longitude: Double): Boolean {
+ manager.removeUpdates(this)
+ val newLongitude = if (longitude > 180.0) longitude - 180 else longitude
+ val locator = QthConverter.positionToQth(latitude, newLongitude) ?: return false
+ saveStationPosition(latitude, newLongitude, locator)
+ return true
+ }
+
+ override fun setQthPosition(locator: String): Boolean {
+ val position = QthConverter.qthToPosition(locator) ?: return false
+ saveStationPosition(position.lat, position.lon, locator)
+ return true
+ }
+
+ override fun onLocationChanged(location: Location) {
+ setGeoPosition(location.latitude, location.longitude)
+ }
+
+ private fun forceLocationUpdate(provider: String) {
+ try {
+ val location = manager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)
+ if (location == null || System.currentTimeMillis() - location.time > 600000) {
+ Timber.d("Requesting $provider location update")
+ manager.requestLocationUpdates(provider, 0L, 0f, this)
+ } else {
+ setGeoPosition(location.latitude, location.longitude)
+ }
+ } catch (exception: SecurityException) {
+ Timber.d("No permissions were given")
+ }
+ }
+
+ private fun saveStationPosition(latitude: Double, longitude: Double, locator: String) {
+ val newLat = latitude.round(4)
+ val newLon = longitude.round(4)
+ Timber.d("Received new Position($newLat, $newLon) & Locator $locator")
+ _stationPosition.value = StationPos(newLat, newLon, locator, System.currentTimeMillis())
+ settings.saveStationPosition(stationPosition.value)
+ }
+}
diff --git a/base/src/main/java/com/rtbishop/look4sat/utility/DataReporter.kt b/app/src/main/java/com/rtbishop/look4sat/framework/NetworkReporter.kt
similarity index 96%
rename from base/src/main/java/com/rtbishop/look4sat/utility/DataReporter.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/NetworkReporter.kt
index 643b8190..89128137 100644
--- a/base/src/main/java/com/rtbishop/look4sat/utility/DataReporter.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/NetworkReporter.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 java.net.InetSocketAddress
import java.nio.ByteBuffer
@@ -25,7 +25,7 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.launch
-class DataReporter(private val reporterScope: CoroutineScope) {
+class NetworkReporter(private val reporterScope: CoroutineScope) {
private var rotationSocketChannel: SocketChannel? = null
private var rotationReporting: Job? = null
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/OrientationManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt
similarity index 57%
rename from app/src/main/java/com/rtbishop/look4sat/framework/OrientationManager.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt
index ab2b2143..5d46789f 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/OrientationManager.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/OrientationSource.kt
@@ -21,47 +21,36 @@ import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
-import com.rtbishop.look4sat.domain.predict.RAD2DEG
-import javax.inject.Inject
-import javax.inject.Singleton
+import com.rtbishop.look4sat.domain.RAD2DEG
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlin.math.round
-@Singleton
-class OrientationManager @Inject constructor(private val sensorManager: SensorManager) :
- SensorEventListener {
+class OrientationSource(
+ private val manager: SensorManager, private val sensor: Sensor?
+) : SensorEventListener {
- interface OrientationListener {
- fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float)
- }
-
- private val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
private val rotationMatrix = FloatArray(9)
private val orientationValues = FloatArray(3)
private var sensorAccuracy: Int = SensorManager.SENSOR_STATUS_UNRELIABLE
- private var orientationListener: OrientationListener? = null
- fun startListening(listener: OrientationListener) {
- if (sensor != null && orientationListener !== listener) {
- orientationListener = listener
- sensorManager.registerListener(this, sensor, 16000)
- } else return
+ private val _orientation = MutableStateFlow(Pair(0f, 0f))
+ val orientation: StateFlow> = _orientation
+
+ fun startListening() = sensor?.let {
+ manager.registerListener(this, it, 16000)
}
- fun stopListening() {
- sensorManager.unregisterListener(this)
- orientationListener = null
- }
+ fun stopListening() = manager.unregisterListener(this)
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
sensorAccuracy = accuracy
}
- override fun onSensorChanged(event: SensorEvent) {
- when {
- orientationListener == null -> return
- sensorAccuracy == SensorManager.SENSOR_STATUS_UNRELIABLE -> return
- event.sensor == sensor -> updateOrientation(event.values)
- }
+ override fun onSensorChanged(event: SensorEvent) = when {
+ sensorAccuracy == SensorManager.SENSOR_STATUS_UNRELIABLE -> {}
+ event.sensor == sensor -> updateOrientation(event.values)
+ else -> {}
}
private fun updateOrientation(rotationVector: FloatArray) {
@@ -69,11 +58,11 @@ class OrientationManager @Inject constructor(private val sensorManager: SensorMa
SensorManager.getOrientation(rotationMatrix, orientationValues)
val azimuth = (orientationValues[0] * RAD2DEG).toFloat()
val pitch = (orientationValues[1] * RAD2DEG).toFloat()
- val roll = (orientationValues[2] * RAD2DEG).toFloat()
+// val roll = (orientationValues[2] * RAD2DEG).toFloat()
val magneticAzimuth = (azimuth + 360f) % 360f
val roundedAzimuth = round(magneticAzimuth * 10) / 10
val roundedPitch = round(pitch * 10) / 10
- val roundedRoll = round(roll * 10) / 10
- orientationListener?.onOrientationChanged(roundedAzimuth, roundedPitch, roundedRoll)
+// val roundedRoll = round(roll * 10) / 10
+ _orientation.value = Pair(roundedAzimuth, roundedPitch)
}
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsSource.kt
similarity index 86%
rename from app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/SettingsSource.kt
index 11cde9cc..725be84c 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/SettingsManager.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/SettingsSource.kt
@@ -19,13 +19,10 @@ package com.rtbishop.look4sat.framework
import android.content.SharedPreferences
import androidx.core.content.edit
-import com.rtbishop.look4sat.domain.ISettingsManager
-import com.rtbishop.look4sat.domain.predict.GeoPos
-import javax.inject.Inject
-import javax.inject.Singleton
+import com.rtbishop.look4sat.domain.ISettingsSource
+import com.rtbishop.look4sat.model.StationPos
-@Singleton
-class SettingsManager @Inject constructor(private val prefs: SharedPreferences) : ISettingsManager {
+class SettingsSource(private val prefs: SharedPreferences) : ISettingsSource {
companion object {
const val keyModes = "satModes"
@@ -46,29 +43,23 @@ class SettingsManager @Inject constructor(private val prefs: SharedPreferences)
const val keyLatitude = "stationLat"
const val keyLongitude = "stationLon"
const val keyLocator = "stationQTH"
+ const val keyLocTimestamp = "locTimestamp"
const val keySelection = "selection"
}
- override fun loadStationLocator(): String {
- return prefs.getString(keyLocator, null) ?: ""
+ override fun loadStationPosition(): StationPos {
+ val latitude = prefs.getString(keyLatitude, null) ?: "0.0"
+ val longitude = prefs.getString(keyLongitude, null) ?: "0.0"
+ val qthLocator = prefs.getString(keyLocator, null) ?: ""
+ val timestamp = prefs.getLong(keyLocTimestamp, 0L)
+ return StationPos(latitude.toDouble(), longitude.toDouble(), qthLocator, timestamp)
}
- override fun saveStationLocator(locator: String) {
- prefs.edit { putString(keyLocator, locator) }
- }
-
- override fun loadStationPosition(): GeoPos {
- val defaultSP = "0.0"
- val latitude = prefs.getString(keyLatitude, null) ?: defaultSP
- val longitude = prefs.getString(keyLongitude, null) ?: defaultSP
- return GeoPos(latitude.toDouble(), longitude.toDouble())
- }
-
- override fun saveStationPosition(position: GeoPos) {
- prefs.edit {
- putString(keyLatitude, position.lat.toString())
- putString(keyLongitude, position.lon.toString())
- }
+ override fun saveStationPosition(stationPos: StationPos) = prefs.edit {
+ putString(keyLatitude, stationPos.latitude.toString())
+ putString(keyLongitude, stationPos.longitude.toString())
+ putString(keyLocator, stationPos.qthLocator)
+ putLong(keyLocTimestamp, stationPos.timestamp)
}
override fun saveEntriesSelection(catnums: List) {
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalDatabase.kt b/app/src/main/java/com/rtbishop/look4sat/framework/data/MainDatabase.kt
similarity index 98%
rename from app/src/main/java/com/rtbishop/look4sat/framework/data/LocalDatabase.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/data/MainDatabase.kt
index 7e3635f3..ab40b90d 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalDatabase.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/data/MainDatabase.kt
@@ -27,7 +27,7 @@ import com.rtbishop.look4sat.framework.model.SatEntry
import com.rtbishop.look4sat.framework.model.SatRadio
@Database(entities = [SatEntry::class, SatRadio::class], version = 2, exportSchema = true)
-abstract class LocalDatabase : RoomDatabase() {
+abstract class MainDatabase : RoomDatabase() {
abstract fun entriesDao(): EntriesDao
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalEntrySource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/data/local/EntriesStorage.kt
similarity index 85%
rename from app/src/main/java/com/rtbishop/look4sat/framework/data/LocalEntrySource.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/data/local/EntriesStorage.kt
index c09d9be3..68ba01f2 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalEntrySource.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/data/local/EntriesStorage.kt
@@ -15,17 +15,17 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.framework.data
+package com.rtbishop.look4sat.framework.data.local
-import com.rtbishop.look4sat.domain.data.ILocalEntrySource
-import com.rtbishop.look4sat.domain.predict.Satellite
+import com.rtbishop.look4sat.data.IEntriesStorage
+import com.rtbishop.look4sat.domain.Satellite
import com.rtbishop.look4sat.framework.data.dao.EntriesDao
-import com.rtbishop.look4sat.domain.model.SatEntry as DomainEntry
-import com.rtbishop.look4sat.domain.model.SatItem as DomainItem
import com.rtbishop.look4sat.framework.model.SatEntry as FrameworkEntry
import com.rtbishop.look4sat.framework.model.SatItem as FrameworkItem
+import com.rtbishop.look4sat.model.SatEntry as DomainEntry
+import com.rtbishop.look4sat.model.SatItem as DomainItem
-class LocalEntrySource(private val entriesDao: EntriesDao) : ILocalEntrySource {
+class EntriesStorage(private val entriesDao: EntriesDao) : IEntriesStorage {
override fun getEntriesTotal() = entriesDao.getEntriesTotal()
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalRadioSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/data/local/RadiosStorage.kt
similarity index 87%
rename from app/src/main/java/com/rtbishop/look4sat/framework/data/LocalRadioSource.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/data/local/RadiosStorage.kt
index 315a7f56..9712ee41 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/data/LocalRadioSource.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/data/local/RadiosStorage.kt
@@ -15,14 +15,14 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.framework.data
+package com.rtbishop.look4sat.framework.data.local
-import com.rtbishop.look4sat.domain.model.SatRadio as DomainRadio
-import com.rtbishop.look4sat.framework.model.SatRadio as FrameworkRadio
-import com.rtbishop.look4sat.domain.data.ILocalRadioSource
+import com.rtbishop.look4sat.data.IRadiosStorage
import com.rtbishop.look4sat.framework.data.dao.RadiosDao
+import com.rtbishop.look4sat.framework.model.SatRadio as FrameworkRadio
+import com.rtbishop.look4sat.model.SatRadio as DomainRadio
-class LocalRadioSource(private val radiosDao: RadiosDao) : ILocalRadioSource {
+class RadiosStorage(private val radiosDao: RadiosDao) : IRadiosStorage {
override fun getRadiosTotal() = radiosDao.getRadiosTotal()
@@ -31,7 +31,6 @@ class LocalRadioSource(private val radiosDao: RadiosDao) : ILocalRadioSource {
}
override suspend fun insertRadios(radios: List) {
- radiosDao.deleteRadios()
radiosDao.insertRadios(radios.toFrameworkRadios())
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/data/FileDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/data/remote/FileSource.kt
similarity index 76%
rename from app/src/main/java/com/rtbishop/look4sat/framework/data/FileDataSource.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/data/remote/FileSource.kt
index afa5d73d..e3a3665c 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/data/FileDataSource.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/data/remote/FileSource.kt
@@ -15,22 +15,21 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.framework.data
+package com.rtbishop.look4sat.framework.data.remote
import android.content.ContentResolver
import android.net.Uri
-import com.rtbishop.look4sat.domain.data.IFileDataSource
+import com.rtbishop.look4sat.data.IFileSource
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import java.io.InputStream
-class FileDataSource(
+class FileSource(
private val contentResolver: ContentResolver,
- private val ioDispatcher: CoroutineDispatcher
-) : IFileDataSource {
+ private val coroutineDispatcher: CoroutineDispatcher
+) : IFileSource {
- @Suppress("BlockingMethodInNonBlockingContext")
override suspend fun getDataStream(uri: String): InputStream? {
- return withContext(ioDispatcher) { contentResolver.openInputStream(Uri.parse(uri)) }
+ return withContext(coroutineDispatcher) { contentResolver.openInputStream(Uri.parse(uri)) }
}
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/data/RemoteDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/data/remote/NetworkSource.kt
similarity index 64%
rename from app/src/main/java/com/rtbishop/look4sat/framework/data/RemoteDataSource.kt
rename to app/src/main/java/com/rtbishop/look4sat/framework/data/remote/NetworkSource.kt
index 9c3c00c0..50c72886 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/data/RemoteDataSource.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/data/remote/NetworkSource.kt
@@ -15,25 +15,17 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.framework.data
+package com.rtbishop.look4sat.framework.data.remote
-import com.rtbishop.look4sat.domain.data.IRemoteDataSource
+import com.rtbishop.look4sat.data.INetworkSource
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
-import okhttp3.OkHttpClient
-import okhttp3.Request
import java.io.InputStream
+import java.net.URL
-class RemoteDataSource(
- private val httpClient: OkHttpClient, private val ioDispatcher: CoroutineDispatcher
-) : IRemoteDataSource {
+class NetworkSource(private val coroutineDispatcher: CoroutineDispatcher) : INetworkSource {
- override suspend fun getDataStream(url: String): InputStream? = withContext(ioDispatcher) {
- try {
- val request = Request.Builder().url(url).build()
- httpClient.newCall(request).execute().body?.byteStream()
- } catch (exception: Exception) {
- null
- }
+ override suspend fun getDataStream(url: String): InputStream? {
+ return withContext(coroutineDispatcher) { URL(url).openStream() }
}
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/model/SatEntry.kt b/app/src/main/java/com/rtbishop/look4sat/framework/model/SatEntry.kt
index 48f231c0..d39b8a16 100644
--- a/app/src/main/java/com/rtbishop/look4sat/framework/model/SatEntry.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/framework/model/SatEntry.kt
@@ -19,7 +19,7 @@ package com.rtbishop.look4sat.framework.model
import androidx.room.Embedded
import androidx.room.Entity
-import com.rtbishop.look4sat.domain.predict.OrbitalData
+import com.rtbishop.look4sat.model.OrbitalData
@Entity(tableName = "entries", primaryKeys = ["catnum"])
data class SatEntry(@Embedded val data: OrbitalData, var comment: String? = null)
diff --git a/app/src/main/java/com/rtbishop/look4sat/injection/AppModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/AppModule.kt
deleted file mode 100644
index e832d430..00000000
--- a/app/src/main/java/com/rtbishop/look4sat/injection/AppModule.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Look4Sat. Amateur radio satellite tracker and pass predictor.
- * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.rtbishop.look4sat.injection
-
-import android.bluetooth.BluetoothManager
-import android.content.Context
-import android.content.SharedPreferences
-import android.hardware.SensorManager
-import android.location.LocationManager
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.android.qualifiers.ApplicationContext
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Singleton
-
-@Module
-@InstallIn(SingletonComponent::class)
-object AppModule {
-
- @Provides
- @Singleton
- fun provideBluetoothManager(@ApplicationContext context: Context): BluetoothManager {
- return context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
- }
-
- @Provides
- @Singleton
- fun provideLocationManager(@ApplicationContext context: Context): LocationManager {
- return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
- }
-
- @Provides
- @Singleton
- fun provideSensorManager(@ApplicationContext context: Context): SensorManager {
- return context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
- }
-
- @Provides
- @Singleton
- fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
- return context.getSharedPreferences("default", Context.MODE_PRIVATE)
- }
-}
diff --git a/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt
deleted file mode 100644
index e4534b9b..00000000
--- a/app/src/main/java/com/rtbishop/look4sat/injection/BaseModule.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Look4Sat. Amateur radio satellite tracker and pass predictor.
- * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.rtbishop.look4sat.injection
-
-import android.bluetooth.BluetoothManager
-import android.content.Context
-import androidx.room.Room
-import com.rtbishop.look4sat.domain.IDataRepository
-import com.rtbishop.look4sat.domain.ILocationManager
-import com.rtbishop.look4sat.domain.ISatelliteManager
-import com.rtbishop.look4sat.domain.ISettingsManager
-import com.rtbishop.look4sat.domain.data.DataRepository
-import com.rtbishop.look4sat.domain.predict.SatelliteManager
-import com.rtbishop.look4sat.framework.LocationManager
-import com.rtbishop.look4sat.framework.SettingsManager
-import com.rtbishop.look4sat.framework.data.FileDataSource
-import com.rtbishop.look4sat.framework.data.LocalDatabase
-import com.rtbishop.look4sat.framework.data.LocalEntrySource
-import com.rtbishop.look4sat.framework.data.LocalRadioSource
-import com.rtbishop.look4sat.framework.data.MIGRATION_1_2
-import com.rtbishop.look4sat.framework.data.RemoteDataSource
-import com.rtbishop.look4sat.presentation.radarScreen.BTReporter
-import com.rtbishop.look4sat.utility.DataParser
-import com.rtbishop.look4sat.utility.DataReporter
-import dagger.Module
-import dagger.Provides
-import dagger.hilt.InstallIn
-import dagger.hilt.android.qualifiers.ApplicationContext
-import dagger.hilt.components.SingletonComponent
-import javax.inject.Singleton
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import okhttp3.OkHttpClient
-
-@Module
-@InstallIn(SingletonComponent::class)
-object BaseModule {
-
- @Provides
- @Singleton
- fun provideDataRepository(
- @ApplicationContext context: Context,
- settings: ISettingsManager
- ): IDataRepository {
- val db = Room.databaseBuilder(context, LocalDatabase::class.java, "Look4SatDb")
- .addMigrations(MIGRATION_1_2).fallbackToDestructiveMigration().build()
- val parser = DataParser(Dispatchers.Default)
- val fileSource = FileDataSource(context.contentResolver, Dispatchers.IO)
- val entries = LocalEntrySource(db.entriesDao())
- val radios = LocalRadioSource(db.radiosDao())
- val remoteSource = RemoteDataSource(OkHttpClient.Builder().build(), Dispatchers.IO)
- val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
- return DataRepository(parser, fileSource, entries, radios, remoteSource, scope, settings)
- }
-
- @Provides
- @Singleton
- fun provideDataReporter(): DataReporter = DataReporter(CoroutineScope(Dispatchers.IO))
-
- @Provides
- @Singleton
- fun provideBTReporter(manager: BluetoothManager): BTReporter {
- return BTReporter(manager, CoroutineScope(Dispatchers.IO))
- }
-
- @Provides
- @Singleton
- fun provideLocationManager(manager: LocationManager): ILocationManager = manager
-
- @Provides
- @Singleton
- fun provideSatelliteManager(): ISatelliteManager = SatelliteManager(Dispatchers.Default)
-
- @Provides
- @Singleton
- fun provideSettingsManager(manager: SettingsManager): ISettingsManager = manager
-}
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt
similarity index 57%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt
index 49495583..20e69fdb 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainScreen.kt
@@ -1,29 +1,5 @@
-/*
- * Look4Sat. Amateur radio satellite tracker and pass predictor.
- * Copyright (C) 2019-2022 Arty Bishop (bishop.arty@gmail.com)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
package com.rtbishop.look4sat.presentation
-import android.annotation.SuppressLint
-import android.content.Context
-import android.content.pm.ActivityInfo
-import android.content.res.Configuration
-import android.os.Bundle
-import androidx.activity.ComponentActivity
-import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -32,7 +8,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
-import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
@@ -41,31 +16,11 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.rtbishop.look4sat.R
-import com.rtbishop.look4sat.presentation.entriesScreen.EntriesScreen
-import com.rtbishop.look4sat.presentation.mapScreen.MapScreen
-import com.rtbishop.look4sat.presentation.passesScreen.PassesScreen
-import com.rtbishop.look4sat.presentation.radarScreen.RadarScreen
-import com.rtbishop.look4sat.presentation.settingsScreen.SettingsScreen
-import dagger.hilt.android.AndroidEntryPoint
-
-@AndroidEntryPoint
-class MainActivity : ComponentActivity() {
-
- @SuppressLint("SourceLockedOrientationActivity")
- override fun onCreate(savedInstanceState: Bundle?) {
- requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
- installSplashScreen()
- super.onCreate(savedInstanceState)
- setContent { MainTheme { MainScreen() } }
- }
-
- override fun attachBaseContext(newBase: Context?) {
- val newConfig = Configuration(newBase?.resources?.configuration)
- newConfig.fontScale = 1.0f
- applyOverrideConfiguration(newConfig)
- super.attachBaseContext(newBase)
- }
-}
+import com.rtbishop.look4sat.presentation.entries.EntriesScreen
+import com.rtbishop.look4sat.presentation.map.MapScreen
+import com.rtbishop.look4sat.presentation.passes.PassesScreen
+import com.rtbishop.look4sat.presentation.radar.RadarScreen
+import com.rtbishop.look4sat.presentation.settings.SettingsScreen
sealed class Screen(var title: String, var icon: Int, var route: String) {
object Entries : Screen("Entries", R.drawable.ic_entries, "entries")
@@ -77,7 +32,7 @@ sealed class Screen(var title: String, var icon: Int, var route: String) {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
-private fun MainScreen(navController: NavHostController = rememberNavController()) {
+fun MainScreen(navController: NavHostController = rememberNavController()) {
Scaffold(bottomBar = { MainNavBar(navController = navController) }) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) { MainNavGraph(navController) }
}
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/FilterDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/FilterDialog.kt
similarity index 98%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/FilterDialog.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/FilterDialog.kt
index 707ae20c..786e5e05 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/FilterDialog.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/FilterDialog.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.presentation.passesScreen
+package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/LocatorDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/LocatorDialog.kt
similarity index 97%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/LocatorDialog.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/LocatorDialog.kt
index 3aba5728..51263f82 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/LocatorDialog.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/LocatorDialog.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.settingsScreen
+package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/ModesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/ModesDialog.kt
similarity index 98%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/ModesDialog.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/ModesDialog.kt
index ef1b121b..bec1a3ef 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/ModesDialog.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/ModesDialog.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.passesScreen
+package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/PositionDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/PositionDialog.kt
similarity index 98%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/PositionDialog.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/PositionDialog.kt
index de725cfb..2b5de5dc 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/settingsScreen/PositionDialog.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/PositionDialog.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.settingsScreen
+package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/TypesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/TypesDialog.kt
similarity index 97%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/TypesDialog.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/TypesDialog.kt
index 66d05400..11d0bf39 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/TypesDialog.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/dialogs/TypesDialog.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.entriesScreen
+package com.rtbishop.look4sat.presentation.dialogs
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt
similarity index 97%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesScreen.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt
index 82b60b5d..9ebd186c 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesScreen.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesScreen.kt
@@ -1,4 +1,4 @@
-package com.rtbishop.look4sat.presentation.entriesScreen
+package com.rtbishop.look4sat.presentation.entries
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
@@ -28,11 +28,12 @@ import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.rtbishop.look4sat.R
-import com.rtbishop.look4sat.domain.model.DataState
-import com.rtbishop.look4sat.domain.model.SatItem
-import com.rtbishop.look4sat.presentation.Screen
+import com.rtbishop.look4sat.model.DataState
+import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.presentation.CardLoadingIndicator
import com.rtbishop.look4sat.presentation.MainTheme
+import com.rtbishop.look4sat.presentation.Screen
+import com.rtbishop.look4sat.presentation.dialogs.TypesDialog
import com.rtbishop.look4sat.presentation.onClick
@Composable
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesViewModel.kt
similarity index 87%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesViewModel.kt
index 92e40d99..817597f5 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entries/EntriesViewModel.kt
@@ -15,15 +15,17 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.presentation.entriesScreen
+package com.rtbishop.look4sat.presentation.entries
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.rtbishop.look4sat.domain.IDataRepository
+import com.rtbishop.look4sat.domain.ILocationSource
import com.rtbishop.look4sat.domain.ISatelliteManager
-import com.rtbishop.look4sat.domain.ISettingsManager
-import com.rtbishop.look4sat.domain.model.DataState
-import com.rtbishop.look4sat.domain.model.SatItem
+import com.rtbishop.look4sat.domain.ISettingsSource
+import com.rtbishop.look4sat.model.DataState
+import com.rtbishop.look4sat.model.GeoPos
+import com.rtbishop.look4sat.model.SatItem
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -37,7 +39,8 @@ import javax.inject.Inject
class EntriesViewModel @Inject constructor(
private val satelliteManager: ISatelliteManager,
private val repository: IDataRepository,
- private val settings: ISettingsManager
+ private val settings: ISettingsSource,
+ private val locationSource: ILocationSource
) : ViewModel() {
private val satType = MutableStateFlow("All")
@@ -78,11 +81,12 @@ class EntriesViewModel @Inject constructor(
settings.saveEntriesSelection(newSelection)
val selectedIds = settings.loadEntriesSelection()
val satellites = repository.getEntriesWithIds(selectedIds)
- val stationPos = settings.loadStationPosition()
+ val stationPos = locationSource.stationPosition.value
+ val geoPos = GeoPos(stationPos.latitude, stationPos.longitude)
val timeRef = System.currentTimeMillis()
val hoursAhead = settings.getHoursAhead()
val minElev = settings.getMinElevation()
- satelliteManager.calculatePasses(satellites, stationPos, timeRef, hoursAhead, minElev)
+ satelliteManager.calculatePasses(satellites, geoPos, timeRef, hoursAhead, minElev)
}
fun updateSelection(catNums: List, isSelected: Boolean) {
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapData.kt
similarity index 91%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/map/MapData.kt
index 4b2c06c2..02e20ca9 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapData.kt
@@ -15,9 +15,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.presentation.mapScreen
+package com.rtbishop.look4sat.presentation.map
-import com.rtbishop.look4sat.domain.predict.GeoPos
+import com.rtbishop.look4sat.model.GeoPos
data class MapData(
val catNum: Int,
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapScreen.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt
similarity index 96%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapScreen.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt
index d804318a..2c82c362 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapScreen.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapScreen.kt
@@ -1,5 +1,6 @@
-package com.rtbishop.look4sat.presentation.mapScreen
+package com.rtbishop.look4sat.presentation.map
+import android.content.Context
import android.graphics.*
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
@@ -22,9 +23,9 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import com.rtbishop.look4sat.R
-import com.rtbishop.look4sat.domain.predict.GeoPos
-import com.rtbishop.look4sat.domain.predict.SatPos
-import com.rtbishop.look4sat.domain.predict.Satellite
+import com.rtbishop.look4sat.domain.Satellite
+import com.rtbishop.look4sat.model.GeoPos
+import com.rtbishop.look4sat.model.SatPos
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint
@@ -60,7 +61,8 @@ private val labelRect = Rect()
@Composable
fun MapScreen(viewModel: MapViewModel = hiltViewModel()) {
val context = LocalContext.current
- Configuration.getInstance().load(context, viewModel.getPreferences())
+ val preferences = context.getSharedPreferences("default", Context.MODE_PRIVATE)
+ Configuration.getInstance().load(context, preferences)
viewModel.selectDefaultSatellite(-1)
val stationPos = viewModel.stationPos.collectAsState(initial = null)
val positions = viewModel.positions.collectAsState(initial = null)
diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt
similarity index 93%
rename from app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt
rename to app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt
index 7070d237..dbe07bc8 100644
--- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt
+++ b/app/src/main/java/com/rtbishop/look4sat/presentation/map/MapViewModel.kt
@@ -15,17 +15,13 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.rtbishop.look4sat.presentation.mapScreen
+package com.rtbishop.look4sat.presentation.map
-import android.content.SharedPreferences
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.rtbishop.look4sat.domain.IDataRepository
-import com.rtbishop.look4sat.domain.ISatelliteManager
-import com.rtbishop.look4sat.domain.ISettingsManager
-import com.rtbishop.look4sat.domain.predict.GeoPos
-import com.rtbishop.look4sat.domain.predict.SatPos
-import com.rtbishop.look4sat.domain.predict.Satellite
+import com.rtbishop.look4sat.domain.*
+import com.rtbishop.look4sat.model.GeoPos
+import com.rtbishop.look4sat.model.SatPos
import com.rtbishop.look4sat.utility.QthConverter
import com.rtbishop.look4sat.utility.toDegrees
import com.rtbishop.look4sat.utility.toTimerString
@@ -42,13 +38,14 @@ import kotlin.math.min
@HiltViewModel
class MapViewModel @Inject constructor(
- private val preferences: SharedPreferences,
private val repository: IDataRepository,
private val satelliteManager: ISatelliteManager,
- private val settings: ISettingsManager
+ private val settings: ISettingsSource,
+ private val locationSource: ILocationSource
) : ViewModel() {
- private val stationPosition = settings.loadStationPosition()
+ private val stationPosNew = locationSource.stationPosition.value
+ private val stationPosition = GeoPos(stationPosNew.latitude, stationPosNew.longitude)
private var allPasses = satelliteManager.getPasses()
private var allSatellites = listOf()
private var dataUpdateJob: Job? = null
@@ -73,8 +70,6 @@ class MapViewModel @Inject constructor(
private val _positions = MutableSharedFlow