From fdb575240831f1b0b6984732d633ca7fb53aec9d Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sat, 8 May 2021 15:44:19 +0100 Subject: [PATCH] Moved and renamed various classes to simplify structure --- .../look4sat/framework/PreferencesProvider.kt | 4 +- .../framework/api/NetworkDataSource.kt | 21 -------- .../look4sat/framework/api/SatDataRemote.kt | 17 ++++++ ...{SatelliteService.kt => SatDataService.kt} | 4 +- .../db/{SatelliteDao.kt => SatDataDao.kt} | 2 +- .../db/{SatelliteDb.kt => SatDataDb.kt} | 4 +- .../db/{RoomDataSource.kt => SatDataLocal.kt} | 16 +++--- .../{di => injection}/ApplicationModule.kt | 8 +-- .../{di => injection}/CoroutinesModule.kt | 2 +- .../SatDataModule.kt} | 54 ++++++++++--------- .../look4sat/presentation/Look4SatActivity.kt | 4 +- .../AppInfoFragment.kt} | 4 +- .../AppSettingsFragment.kt} | 12 ++--- .../AppSplashDialog.kt} | 4 +- .../SatItemAdapter.kt} | 4 +- .../SatItemFragment.kt} | 12 ++--- .../SatItemViewModel.kt} | 36 +++++-------- .../SatMapFragment.kt} | 26 ++++----- .../SatMapViewModel.kt} | 24 ++++----- .../PassInfoFragment.kt} | 25 ++++----- .../PassInfoView.kt} | 4 +- .../PassInfoViewModel.kt} | 30 +++++------ .../SatTransAdapter.kt} | 4 +- .../SatPassAdapter.kt} | 4 +- .../SatPassFragment.kt} | 12 ++--- .../SatPassViewModel.kt} | 22 ++++---- app/src/main/res/layout/fragment_info.xml | 2 +- app/src/main/res/navigation/nav_graph.xml | 14 ++--- ...eferenceSource.kt => PreferencesSource.kt} | 2 +- ...calDataSource.kt => SatDataLocalSource.kt} | 2 +- ...teDataSource.kt => SatDataRemoteSource.kt} | 2 +- ...{SatelliteRepo.kt => SatDataRepository.kt} | 45 +++++++++++----- .../{PassesRepo.kt => SatPassRepository.kt} | 12 ++--- 33 files changed, 224 insertions(+), 214 deletions(-) delete mode 100644 app/src/main/java/com/rtbishop/look4sat/framework/api/NetworkDataSource.kt create mode 100644 app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataRemote.kt rename app/src/main/java/com/rtbishop/look4sat/framework/api/{SatelliteService.kt => SatDataService.kt} (97%) rename app/src/main/java/com/rtbishop/look4sat/framework/db/{SatelliteDao.kt => SatDataDao.kt} (99%) rename app/src/main/java/com/rtbishop/look4sat/framework/db/{SatelliteDb.kt => SatDataDb.kt} (92%) rename app/src/main/java/com/rtbishop/look4sat/framework/db/{RoomDataSource.kt => SatDataLocal.kt} (72%) rename app/src/main/java/com/rtbishop/look4sat/{di => injection}/ApplicationModule.kt (91%) rename app/src/main/java/com/rtbishop/look4sat/{di => injection}/CoroutinesModule.kt (97%) rename app/src/main/java/com/rtbishop/look4sat/{di/DataSourceModule.kt => injection/SatDataModule.kt} (65%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{infoScreen/InfoFragment.kt => appInfoScreen/AppInfoFragment.kt} (94%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{prefsScreen/PrefsFragment.kt => appSettingsScreen/AppSettingsFragment.kt} (92%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{splashDialog/SplashDialog.kt => appSplashDialog/AppSplashDialog.kt} (93%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{entriesScreen/EntriesAdapter.kt => satItemScreen/SatItemAdapter.kt} (96%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{entriesScreen/EntriesFragment.kt => satItemScreen/SatItemFragment.kt} (92%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{entriesScreen/EntriesViewModel.kt => satItemScreen/SatItemViewModel.kt} (75%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{mapScreen/MapFragment.kt => satMapScreen/SatMapFragment.kt} (89%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{mapScreen/MapViewModel.kt => satMapScreen/SatMapViewModel.kt} (91%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{polarScreen/PolarFragment.kt => satPassInfoScreen/PassInfoFragment.kt} (85%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{polarScreen/PolarView.kt => satPassInfoScreen/PassInfoView.kt} (98%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{polarScreen/PolarViewModel.kt => satPassInfoScreen/PassInfoViewModel.kt} (80%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{polarScreen/TransAdapter.kt => satPassInfoScreen/SatTransAdapter.kt} (96%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{passesScreen/PassesAdapter.kt => satPassScreen/SatPassAdapter.kt} (97%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{passesScreen/PassesFragment.kt => satPassScreen/SatPassFragment.kt} (92%) rename app/src/main/java/com/rtbishop/look4sat/presentation/{passesScreen/PassesViewModel.kt => satPassScreen/SatPassViewModel.kt} (81%) rename core/src/main/java/com/rtbishop/look4sat/data/{PreferenceSource.kt => PreferencesSource.kt} (96%) rename core/src/main/java/com/rtbishop/look4sat/data/{LocalDataSource.kt => SatDataLocalSource.kt} (95%) rename core/src/main/java/com/rtbishop/look4sat/data/{RemoteDataSource.kt => SatDataRemoteSource.kt} (87%) rename core/src/main/java/com/rtbishop/look4sat/data/{SatelliteRepo.kt => SatDataRepository.kt} (58%) rename core/src/main/java/com/rtbishop/look4sat/data/{PassesRepo.kt => SatPassRepository.kt} (86%) diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/PreferencesProvider.kt b/app/src/main/java/com/rtbishop/look4sat/framework/PreferencesProvider.kt index 9e57bddb..aede7764 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/PreferencesProvider.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/PreferencesProvider.kt @@ -21,7 +21,7 @@ import android.content.SharedPreferences import android.hardware.GeomagneticField import android.location.LocationManager import androidx.core.content.edit -import com.rtbishop.look4sat.data.PreferenceSource +import com.rtbishop.look4sat.data.PreferencesSource import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition import com.rtbishop.look4sat.utility.round @@ -31,7 +31,7 @@ class PreferencesProvider @Inject constructor( private val qthConverter: QthConverter, private val locationManager: LocationManager, private val preferences: SharedPreferences -) : PreferenceSource { +) : PreferencesSource { companion object { const val keyModes = "satModes" diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/api/NetworkDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/api/NetworkDataSource.kt deleted file mode 100644 index 8b9a5f43..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/framework/api/NetworkDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.rtbishop.look4sat.framework.api - -import com.rtbishop.look4sat.data.RemoteDataSource -import com.rtbishop.look4sat.domain.model.SatTrans -import java.io.InputStream - -class NetworkDataSource(private val api: SatelliteService) : RemoteDataSource { - - override suspend fun fetchDataStream(url: String): InputStream? { - return api.fetchFileByUrl(url).body()?.byteStream() - } - - override suspend fun fetchTransmitters(): List { - return api.fetchTransmitters().map { trans -> - SatTrans( - trans.uuid, trans.info, trans.isAlive, trans.downlink, - trans.uplink, trans.mode, trans.isInverted, trans.catNum - ) - } - } -} diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataRemote.kt b/app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataRemote.kt new file mode 100644 index 00000000..dadf0ccc --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataRemote.kt @@ -0,0 +1,17 @@ +package com.rtbishop.look4sat.framework.api + +import com.rtbishop.look4sat.data.SatDataRemoteSource +import com.rtbishop.look4sat.domain.model.SatTrans +import com.rtbishop.look4sat.utility.DataMapper +import java.io.InputStream + +class SatDataRemote(private val api: SatDataService) : SatDataRemoteSource { + + override suspend fun fetchDataStream(url: String): InputStream? { + return api.fetchFileByUrl(url).body()?.byteStream() + } + + override suspend fun fetchTransmitters(): List { + return DataMapper.satTransListToDomainTransList(api.fetchTransmitters()) + } +} diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/api/SatelliteService.kt b/app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataService.kt similarity index 97% rename from app/src/main/java/com/rtbishop/look4sat/framework/api/SatelliteService.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataService.kt index 7f0fd2da..3d341688 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/api/SatelliteService.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/api/SatDataService.kt @@ -24,12 +24,12 @@ import retrofit2.http.GET import retrofit2.http.Streaming import retrofit2.http.Url -interface SatelliteService { +interface SatDataService { @Streaming @GET suspend fun fetchFileByUrl(@Url url: String): Response - + @GET("transmitters/") suspend fun fetchTransmitters(): List } diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDao.kt b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDao.kt similarity index 99% rename from app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDao.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDao.kt index 443e02cf..4d0c8b34 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDao.kt @@ -25,7 +25,7 @@ import com.rtbishop.look4sat.domain.predict4kotlin.Satellite import kotlinx.coroutines.flow.Flow @Dao -interface SatelliteDao { +interface SatDataDao { @Transaction @Query("SELECT catNum, name, isSelected FROM entries ORDER BY name ASC") diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDb.kt similarity index 92% rename from app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDb.kt index a9dde316..3246a4ff 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/db/SatelliteDb.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataDb.kt @@ -25,7 +25,7 @@ import com.rtbishop.look4sat.framework.model.SatTrans @Database(entities = [SatEntry::class, SatTrans::class], version = 1, exportSchema = false) @TypeConverters(RoomConverters::class) -abstract class SatelliteDb : RoomDatabase() { +abstract class SatDataDb : RoomDatabase() { - abstract fun satelliteDao(): SatelliteDao + abstract fun satelliteDao(): SatDataDao } diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/db/RoomDataSource.kt b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataLocal.kt similarity index 72% rename from app/src/main/java/com/rtbishop/look4sat/framework/db/RoomDataSource.kt rename to app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataLocal.kt index e3beda15..8b5ae24c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/framework/db/RoomDataSource.kt +++ b/app/src/main/java/com/rtbishop/look4sat/framework/db/SatDataLocal.kt @@ -1,6 +1,6 @@ package com.rtbishop.look4sat.framework.db -import com.rtbishop.look4sat.data.LocalDataSource +import com.rtbishop.look4sat.data.SatDataLocalSource import com.rtbishop.look4sat.domain.model.SatEntry import com.rtbishop.look4sat.domain.model.SatItem import com.rtbishop.look4sat.domain.model.SatTrans @@ -9,33 +9,33 @@ import com.rtbishop.look4sat.utility.DataMapper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class RoomDataSource(private val satelliteDao: SatelliteDao) : LocalDataSource { +class SatDataLocal(private val satDataDao: SatDataDao) : SatDataLocalSource { override fun getSatItems(): Flow> { - return satelliteDao.getSatItems() + return satDataDao.getSatItems() .map { satItems -> DataMapper.satItemsToDomainItems(satItems) } } override suspend fun getSelectedSatellites(): List { - return satelliteDao.getSelectedSatellites() + return satDataDao.getSelectedSatellites() } override suspend fun updateEntries(entries: List) { val satEntries = entries.map { entry -> DataMapper.domainEntryToSatEntry(entry) } - satelliteDao.updateEntries(satEntries) + satDataDao.updateEntries(satEntries) } override suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { - satelliteDao.updateEntriesSelection(catNums, isSelected) + satDataDao.updateEntriesSelection(catNums, isSelected) } override fun getSatTransmitters(catNum: Int): Flow> { - return satelliteDao.getSatTransmitters(catNum) + return satDataDao.getSatTransmitters(catNum) .map { satTransList -> DataMapper.satTransListToDomainTransList(satTransList) } } override suspend fun updateTransmitters(satelliteTrans: List) { val satTransList = DataMapper.domainTransListToSatTransList(satelliteTrans) - satelliteDao.updateTransmitters(satTransList) + satDataDao.updateTransmitters(satTransList) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/di/ApplicationModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/ApplicationModule.kt similarity index 91% rename from app/src/main/java/com/rtbishop/look4sat/di/ApplicationModule.kt rename to app/src/main/java/com/rtbishop/look4sat/injection/ApplicationModule.kt index 509e5f19..0010d5d3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/di/ApplicationModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/ApplicationModule.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.di +package com.rtbishop.look4sat.injection import android.content.ContentResolver import android.content.Context @@ -23,7 +23,6 @@ import android.content.SharedPreferences import android.hardware.SensorManager import android.location.LocationManager import androidx.preference.PreferenceManager -import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -34,11 +33,6 @@ import dagger.hilt.components.SingletonComponent @InstallIn(SingletonComponent::class) object ApplicationModule { - @Provides - fun provideQthConverter(): QthConverter { - return QthConverter() - } - @Provides fun provideContentResolver(@ApplicationContext context: Context): ContentResolver { return context.contentResolver diff --git a/app/src/main/java/com/rtbishop/look4sat/di/CoroutinesModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/CoroutinesModule.kt similarity index 97% rename from app/src/main/java/com/rtbishop/look4sat/di/CoroutinesModule.kt rename to app/src/main/java/com/rtbishop/look4sat/injection/CoroutinesModule.kt index a09e1741..539c2611 100644 --- a/app/src/main/java/com/rtbishop/look4sat/di/CoroutinesModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/CoroutinesModule.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.di +package com.rtbishop.look4sat.injection import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt b/app/src/main/java/com/rtbishop/look4sat/injection/SatDataModule.kt similarity index 65% rename from app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt rename to app/src/main/java/com/rtbishop/look4sat/injection/SatDataModule.kt index afbdda57..fe9beb6e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/di/DataSourceModule.kt +++ b/app/src/main/java/com/rtbishop/look4sat/injection/SatDataModule.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.di +package com.rtbishop.look4sat.injection import android.content.Context import android.content.SharedPreferences @@ -24,12 +24,12 @@ import androidx.room.Room import com.rtbishop.look4sat.data.* import com.rtbishop.look4sat.domain.predict4kotlin.QthConverter import com.rtbishop.look4sat.framework.PreferencesProvider -import com.rtbishop.look4sat.framework.api.NetworkDataSource -import com.rtbishop.look4sat.framework.api.SatelliteService +import com.rtbishop.look4sat.framework.api.SatDataRemote +import com.rtbishop.look4sat.framework.api.SatDataService import com.rtbishop.look4sat.framework.db.RoomConverters -import com.rtbishop.look4sat.framework.db.RoomDataSource -import com.rtbishop.look4sat.framework.db.SatelliteDao -import com.rtbishop.look4sat.framework.db.SatelliteDb +import com.rtbishop.look4sat.framework.db.SatDataLocal +import com.rtbishop.look4sat.framework.db.SatDataDao +import com.rtbishop.look4sat.framework.db.SatDataDb import com.squareup.moshi.Moshi import dagger.Module import dagger.Provides @@ -43,7 +43,12 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object DataSourceModule { +object SatDataModule { + + @Provides + fun provideQthConverter(): QthConverter { + return QthConverter() + } @Provides fun provideMoshi(): Moshi { @@ -56,56 +61,57 @@ object DataSourceModule { qthConverter: QthConverter, locationManager: LocationManager, preferences: SharedPreferences - ): PreferenceSource { + ): PreferencesSource { return PreferencesProvider(qthConverter, locationManager, preferences) } @Provides @Singleton fun providePassesRepo( - preferenceSource: PreferenceSource, + preferencesSource: PreferencesSource, @DefaultDispatcher defaultDispatcher: CoroutineDispatcher - ): PassesRepo { - return PassesRepo(preferenceSource, defaultDispatcher) + ): SatPassRepository { + return SatPassRepository(preferencesSource, defaultDispatcher) } @Provides @Singleton fun provideSatelliteRepo( - localSource: LocalDataSource, - remoteSource: RemoteDataSource, + preferencesSource: PreferencesSource, + satLocalSource: SatDataLocalSource, + satRemoteSource: SatDataRemoteSource, @IoDispatcher ioDispatcher: CoroutineDispatcher - ): SatelliteRepo { - return SatelliteRepo(localSource, remoteSource, ioDispatcher) + ): SatDataRepository { + return SatDataRepository(preferencesSource, satLocalSource, satRemoteSource, ioDispatcher) } @Provides - fun provideLocalDataSource(satelliteDao: SatelliteDao): LocalDataSource { - return RoomDataSource(satelliteDao) + fun provideLocalDataSource(satDataDao: SatDataDao): SatDataLocalSource { + return SatDataLocal(satDataDao) } @Provides - fun provideSatDataDao(db: SatelliteDb): SatelliteDao { + fun provideSatDataDao(db: SatDataDb): SatDataDao { return db.satelliteDao() } @Provides - fun provideSatelliteDb(@ApplicationContext context: Context, moshi: Moshi): SatelliteDb { + fun provideSatelliteDb(@ApplicationContext context: Context, moshi: Moshi): SatDataDb { RoomConverters.initialize(moshi) - return Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb").build() + return Room.databaseBuilder(context, SatDataDb::class.java, "SatelliteDb").build() } @Provides - fun provideRemoteDataSource(satelliteService: SatelliteService): RemoteDataSource { - return NetworkDataSource(satelliteService) + fun provideRemoteDataSource(satDataService: SatDataService): SatDataRemoteSource { + return SatDataRemote(satDataService) } @Provides - fun provideSatDataService(): SatelliteService { + fun provideSatDataService(): SatDataService { return Retrofit.Builder() .baseUrl("https://db.satnogs.org/api/") .addConverterFactory(MoshiConverterFactory.create()) .build() - .create(SatelliteService::class.java) + .create(SatDataService::class.java) } } 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 50b1e923..1fce5cc2 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt @@ -24,8 +24,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.rtbishop.look4sat.R +import com.rtbishop.look4sat.data.PreferencesSource import com.rtbishop.look4sat.databinding.ActivityMainBinding -import com.rtbishop.look4sat.framework.PreferencesProvider import com.rtbishop.look4sat.utility.navigateSafe import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -34,7 +34,7 @@ import javax.inject.Inject class Look4SatActivity : AppCompatActivity() { @Inject - lateinit var preferenceSource: PreferencesProvider + lateinit var preferenceSource: PreferencesSource @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/infoScreen/InfoFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/appInfoScreen/AppInfoFragment.kt similarity index 94% rename from app/src/main/java/com/rtbishop/look4sat/presentation/infoScreen/InfoFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/appInfoScreen/AppInfoFragment.kt index be3cd9a1..7e47e3c8 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/infoScreen/InfoFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/appInfoScreen/AppInfoFragment.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.infoScreen +package com.rtbishop.look4sat.presentation.appInfoScreen import android.content.Intent import android.net.Uri @@ -27,7 +27,7 @@ import com.rtbishop.look4sat.BuildConfig import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentInfoBinding -class InfoFragment : Fragment(R.layout.fragment_info) { +class AppInfoFragment : Fragment(R.layout.fragment_info) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt similarity index 92% rename from app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.kt index 43b7411d..1145687d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/prefsScreen/PrefsFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/appSettingsScreen/AppSettingsFragment.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.prefsScreen +package com.rtbishop.look4sat.presentation.appSettingsScreen import android.Manifest import android.content.pm.PackageManager @@ -30,16 +30,16 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.snackbar.Snackbar import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.data.PreferenceSource +import com.rtbishop.look4sat.data.PreferencesSource import com.rtbishop.look4sat.framework.PreferencesProvider import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class PrefsFragment : PreferenceFragmentCompat() { +class AppSettingsFragment : PreferenceFragmentCompat() { @Inject - lateinit var preferenceSource: PreferenceSource + lateinit var preferencesSource: PreferencesSource private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> @@ -96,7 +96,7 @@ class PrefsFragment : PreferenceFragmentCompat() { } private fun updatePositionFromQth(qthString: String): Boolean { - return if (preferenceSource.updatePositionFromQTH(qthString)) { + return if (preferencesSource.updatePositionFromQTH(qthString)) { showSnack(getString(R.string.pref_pos_success)) true } else { @@ -109,7 +109,7 @@ class PrefsFragment : PreferenceFragmentCompat() { val locPermString = Manifest.permission.ACCESS_FINE_LOCATION val locPermResult = ContextCompat.checkSelfPermission(requireContext(), locPermString) if (locPermResult == PackageManager.PERMISSION_GRANTED) { - if (preferenceSource.updatePositionFromGPS()) { + if (preferencesSource.updatePositionFromGPS()) { showSnack(getString(R.string.pref_pos_success)) } else showSnack(getString(R.string.pref_pos_gps_null)) } else requestPermissionLauncher.launch(locPermString) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/splashDialog/SplashDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.kt similarity index 93% rename from app/src/main/java/com/rtbishop/look4sat/presentation/splashDialog/SplashDialog.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.kt index 54c9a6f1..c67bba1b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/splashDialog/SplashDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/appSplashDialog/AppSplashDialog.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.splashDialog +package com.rtbishop.look4sat.presentation.appSplashDialog import android.os.Bundle import android.view.LayoutInflater @@ -26,7 +26,7 @@ import androidx.appcompat.app.AppCompatDialogFragment import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.DialogSplashBinding -class SplashDialog : AppCompatDialogFragment() { +class AppSplashDialog : AppCompatDialogFragment() { override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? { return inflater.inflate(R.layout.dialog_splash, group, false) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemAdapter.kt similarity index 96% rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesAdapter.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemAdapter.kt index 5ed24f13..3b3ca1a7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemAdapter.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.entriesScreen +package com.rtbishop.look4sat.presentation.satItemScreen import android.view.LayoutInflater import android.view.ViewGroup @@ -25,7 +25,7 @@ import androidx.recyclerview.widget.RecyclerView import com.rtbishop.look4sat.databinding.SatItemBinding import com.rtbishop.look4sat.domain.model.SatItem -class EntriesAdapter : RecyclerView.Adapter() { +class SatItemAdapter : RecyclerView.Adapter() { private val diffCallback = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SatItem, newItem: SatItem): Boolean { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt similarity index 92% rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.kt index 4b68b38e..44e6a58a 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemFragment.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.entriesScreen +package com.rtbishop.look4sat.presentation.satItemScreen import android.os.Bundle import android.view.View @@ -33,9 +33,9 @@ import com.rtbishop.look4sat.utility.RecyclerDivider import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class EntriesFragment : Fragment(R.layout.fragment_entries) { +class SatItemFragment : Fragment(R.layout.fragment_entries) { - private val viewModel: EntriesViewModel by viewModels() + private val viewModel: SatItemViewModel by viewModels() private val contentContract = ActivityResultContracts.GetContent() private val filePicker = registerForActivityResult(contentContract) { uri -> uri?.let { viewModel.updateEntriesFromFile(uri) } @@ -47,7 +47,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { } private fun setupComponents(view: View) { - val entriesAdapter = EntriesAdapter().apply { + val entriesAdapter = SatItemAdapter().apply { setEntriesClickListener(viewModel) } val binding = FragmentEntriesBinding.bind(view).apply { @@ -72,11 +72,11 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { private fun handleSatData( result: Result>, binding: FragmentEntriesBinding, - entriesAdapter: EntriesAdapter + satItemAdapter: SatItemAdapter ) { when (result) { is Result.Success -> { - entriesAdapter.submitList(result.data) + satItemAdapter.submitList(result.data) binding.entriesProgress.visibility = View.INVISIBLE binding.entriesRecycler.visibility = View.VISIBLE binding.entriesRecycler.scrollToPosition(0) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemViewModel.kt similarity index 75% rename from app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemViewModel.kt index f8ef64ef..6f6e696d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satItemScreen/SatItemViewModel.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.entriesScreen +package com.rtbishop.look4sat.presentation.satItemScreen import android.content.ContentResolver import android.content.Context @@ -25,9 +25,8 @@ import androidx.appcompat.app.AlertDialog import androidx.lifecycle.* import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.rtbishop.look4sat.R -import com.rtbishop.look4sat.data.SatelliteRepo +import com.rtbishop.look4sat.data.SatDataRepository import com.rtbishop.look4sat.domain.model.SatItem -import com.rtbishop.look4sat.framework.PreferencesProvider import com.rtbishop.look4sat.framework.model.Result import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect @@ -36,16 +35,15 @@ import java.util.* import javax.inject.Inject @HiltViewModel -class EntriesViewModel @Inject constructor( - private val preferenceSource: PreferencesProvider, +class SatItemViewModel @Inject constructor( private val resolver: ContentResolver, - private val satelliteRepo: SatelliteRepo, -) : ViewModel(), EntriesAdapter.EntriesClickListener, SearchView.OnQueryTextListener { + private val satDataRepository: SatDataRepository, +) : ViewModel(), SatItemAdapter.EntriesClickListener, SearchView.OnQueryTextListener { - private val transModes = MutableLiveData(preferenceSource.loadModesSelection()) + private val transModes = MutableLiveData(satDataRepository.loadModesSelection()) private val currentQuery = MutableLiveData(String()) private val itemsWithModes = transModes.switchMap { modes -> - liveData { satelliteRepo.getSatItems().collect { emit(filterByModes(it, modes)) } } + liveData { satDataRepository.getSatItems().collect { emit(filterByModes(it, modes)) } } } private val itemsWithQuery = currentQuery.switchMap { query -> itemsWithModes.map { items -> Result.Success(filterByQuery(items, query)) } @@ -61,7 +59,7 @@ class EntriesViewModel @Inject constructor( _satData.value = Result.InProgress runCatching { resolver.openInputStream(uri)?.use { stream -> - satelliteRepo.updateEntriesFromFile(stream) + satDataRepository.updateEntriesFromFile(stream) } }.onFailure { _satData.value = Result.Error(it) } } @@ -71,8 +69,8 @@ class EntriesViewModel @Inject constructor( viewModelScope.launch { _satData.value = Result.InProgress runCatching { - if (sources == null) satelliteRepo.updateEntriesFromWeb() - else satelliteRepo.updateEntriesFromWeb(sources) + if (sources == null) satDataRepository.updateEntriesFromWeb() + else satDataRepository.updateEntriesFromWeb(sources) }.onFailure { _satData.value = Result.Error(it) } } } @@ -86,15 +84,9 @@ class EntriesViewModel @Inject constructor( } fun createModesDialog(context: Context): AlertDialog { - val modes = arrayOf( - "AFSK", "AFSK S-Net", "AFSK SALSAT", "AHRPT", "AM", "APT", "BPSK", "BPSK PMT-A3", - "CERTO", "CW", "DQPSK", "DSTAR", "DUV", "FFSK", "FM", "FMN", "FSK", "FSK AX.100 Mode 5", - "FSK AX.100 Mode 6", "FSK AX.25 G3RUH", "GFSK", "GFSK Rktr", "GMSK", "HRPT", "LoRa", - "LRPT", "LSB", "MFSK", "MSK", "MSK AX.100 Mode 5", "MSK AX.100 Mode 6", "OFDM", "OQPSK", - "PSK", "PSK31", "PSK63", "QPSK", "QPSK31", "QPSK63", "SSTV", "USB", "WSJT" - ) + val modes = satDataRepository.getAllModes() val savedModes = BooleanArray(modes.size) - val selectedModes = preferenceSource.loadModesSelection().toMutableList() + val selectedModes = satDataRepository.loadModesSelection().toMutableList() selectedModes.forEach { savedModes[modes.indexOf(it)] = true } val dialogBuilder = MaterialAlertDialogBuilder(context).apply { setTitle(context.getString(R.string.modes_title)) @@ -106,7 +98,7 @@ class EntriesViewModel @Inject constructor( } setPositiveButton(context.getString(android.R.string.ok)) { _, _ -> transModes.value = selectedModes - preferenceSource.saveModesSelection(selectedModes) + satDataRepository.saveModesSelection(selectedModes) } setNeutralButton(context.getString(android.R.string.cancel)) { dialog, _ -> dialog.dismiss() @@ -125,7 +117,7 @@ class EntriesViewModel @Inject constructor( } override fun updateSelection(catNums: List, isSelected: Boolean) { - viewModelScope.launch { satelliteRepo.updateEntriesSelection(catNums, isSelected) } + viewModelScope.launch { satDataRepository.updateEntriesSelection(catNums, isSelected) } } private fun filterByModes(items: List, modes: List): List { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapFragment.kt similarity index 89% rename from app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapFragment.kt index 7bd2b32e..d23e61fb 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapFragment.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.mapScreen +package com.rtbishop.look4sat.presentation.satMapScreen import android.content.SharedPreferences import android.graphics.Color @@ -44,12 +44,12 @@ import java.util.* import javax.inject.Inject @AndroidEntryPoint -class MapFragment : Fragment(R.layout.fragment_map) { +class SatMapFragment : Fragment(R.layout.fragment_map) { @Inject lateinit var sharedPreferences: SharedPreferences - private val viewModel: MapViewModel by viewModels() + private val viewModelSat: SatMapViewModel by viewModels() private val minLat = MapView.getTileSystem().minLatitude private val maxLat = MapView.getTileSystem().maxLatitude private val trackPaint = Paint().apply { @@ -86,17 +86,17 @@ class MapFragment : Fragment(R.layout.fragment_map) { overlays.addAll(Array(4) { FolderOverlay() }) } } - binding.fabPrev.setOnClickListener { viewModel.scrollSelection(true) } - binding.fabNext.setOnClickListener { viewModel.scrollSelection(false) } + binding.fabPrev.setOnClickListener { viewModelSat.scrollSelection(true) } + binding.fabNext.setOnClickListener { viewModelSat.scrollSelection(false) } setupObservers(binding) } private fun setupObservers(binding: FragmentMapBinding) { - viewModel.stationPos.observe(viewLifecycleOwner, { renderStationPos(it, binding) }) - viewModel.allSatPositions.observe(viewLifecycleOwner, { renderSatPositions(it, binding) }) - viewModel.satTrack.observe(viewLifecycleOwner, { renderSatTrack(it, binding) }) - viewModel.satFootprint.observe(viewLifecycleOwner, { renderSatFootprint(it, binding) }) - viewModel.satData.observe(viewLifecycleOwner, { renderSatData(it, binding) }) + viewModelSat.stationPos.observe(viewLifecycleOwner, { renderStationPos(it, binding) }) + viewModelSat.allSatPositions.observe(viewLifecycleOwner, { renderSatPositions(it, binding) }) + viewModelSat.satTrack.observe(viewLifecycleOwner, { renderSatTrack(it, binding) }) + viewModelSat.satFootprint.observe(viewLifecycleOwner, { renderSatFootprint(it, binding) }) + viewModelSat.satData.observe(viewLifecycleOwner, { renderSatData(it, binding) }) } private fun renderStationPos(stationPos: Position, binding: FragmentMapBinding) { @@ -116,7 +116,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { binding.apply { val markers = FolderOverlay() posMap.entries.forEach { - if (viewModel.shouldUseTextLabels()) { + if (viewModelSat.shouldUseTextLabels()) { Marker(mapView).apply { setInfoWindow(null) textLabelFontSize = 24 @@ -131,7 +131,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { Timber.d(exception) } setOnMarkerClickListener { _, _ -> - viewModel.selectSatellite(it.key) + viewModelSat.selectSatellite(it.key) return@setOnMarkerClickListener true } markers.add(this) @@ -147,7 +147,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { Timber.d(exception) } setOnMarkerClickListener { _, _ -> - viewModel.selectSatellite(it.key) + viewModelSat.selectSatellite(it.key) return@setOnMarkerClickListener true } markers.add(this) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapViewModel.kt similarity index 91% rename from app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapViewModel.kt index 6f72a5b7..ebefabc6 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satMapScreen/SatMapViewModel.kt @@ -15,12 +15,12 @@ * 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.satMapScreen import androidx.lifecycle.* -import com.rtbishop.look4sat.data.PreferenceSource -import com.rtbishop.look4sat.data.SatelliteRepo -import com.rtbishop.look4sat.di.DefaultDispatcher +import com.rtbishop.look4sat.data.PreferencesSource +import com.rtbishop.look4sat.data.SatDataRepository +import com.rtbishop.look4sat.injection.DefaultDispatcher import com.rtbishop.look4sat.domain.predict4kotlin.Position import com.rtbishop.look4sat.domain.predict4kotlin.Satellite import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition @@ -35,13 +35,13 @@ import kotlin.math.pow import kotlin.math.sqrt @HiltViewModel -class MapViewModel @Inject constructor( - private val satelliteRepo: SatelliteRepo, - private val preferenceSource: PreferenceSource, +class SatMapViewModel @Inject constructor( + private val satDataRepository: SatDataRepository, + private val preferencesSource: PreferencesSource, @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher ) : ViewModel() { - private val gsp = preferenceSource.loadStationPosition() + private val gsp = preferencesSource.loadStationPosition() private var dataUpdateJob: Job? = null private var allSatList = listOf() private lateinit var selectedSat: Satellite @@ -66,7 +66,7 @@ class MapViewModel @Inject constructor( init { viewModelScope.launch { - satelliteRepo.getSelectedSatellites().also { selectedSatellites -> + satDataRepository.getSelectedSatellites().also { selectedSatellites -> if (selectedSatellites.isNotEmpty()) { allSatList = selectedSatellites selectSatellite(selectedSatellites.first()) @@ -76,7 +76,7 @@ class MapViewModel @Inject constructor( } fun shouldUseTextLabels(): Boolean { - return preferenceSource.shouldUseTextLabels() + return preferencesSource.shouldUseTextLabels() } fun scrollSelection(decrement: Boolean) { @@ -171,13 +171,13 @@ class MapViewModel @Inject constructor( val osmLon = getOsmLon(Math.toDegrees(satPos.longitude)) val osmPos = Position(osmLat, osmLon) val qthLoc = - preferenceSource.positionToQTH(osmPos.latitude, osmPos.longitude) ?: "-- --" + preferencesSource.positionToQTH(osmPos.latitude, osmPos.longitude) ?: "-- --" val velocity = getOrbitalVelocity(satPos.altitude) val satData = SatData( sat, sat.tle.catnum, sat.tle.name, satPos.range, satPos.altitude, velocity, qthLoc, osmPos ) - this@MapViewModel._satData.postValue(satData) + this@SatMapViewModel._satData.postValue(satData) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoFragment.kt similarity index 85% rename from app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoFragment.kt index 572cd338..6021f547 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoFragment.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.polarScreen +package com.rtbishop.look4sat.presentation.satPassInfoScreen import android.os.Bundle import android.view.View @@ -34,15 +34,15 @@ import dagger.hilt.android.AndroidEntryPoint import java.util.* @AndroidEntryPoint -class PolarFragment : Fragment(R.layout.fragment_polar) { +class PassInfoFragment : Fragment(R.layout.fragment_polar) { - private val viewModel: PolarViewModel by viewModels() - private var polarView: PolarView? = null + private val viewModel: PassInfoViewModel by viewModels() + private var passInfoView: PassInfoView? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) FragmentPolarBinding.bind(view).apply { - val transAdapter = TransAdapter() + val transAdapter = SatTransAdapter() recycler.apply { setHasFixedSize(true) adapter = transAdapter @@ -65,27 +65,27 @@ class PolarFragment : Fragment(R.layout.fragment_polar) { viewModel.disableSensor() } - private fun setupObservers(transAdapter: TransAdapter, binding: FragmentPolarBinding) { + private fun setupObservers(satTransAdapter: SatTransAdapter, binding: FragmentPolarBinding) { val catNum = requireArguments().getInt("catNum") val aosTime = requireArguments().getLong("aosTime") viewModel.getPass(catNum, aosTime).observe(viewLifecycleOwner) { pass -> - polarView = PolarView(requireContext()).apply { setPass(pass) } - binding.frame.addView(polarView) - observeTransmitters(pass, transAdapter, binding) + passInfoView = PassInfoView(requireContext()).apply { setPass(pass) } + binding.frame.addView(passInfoView) + observeTransmitters(pass, satTransAdapter, binding) } viewModel.orientation.observe(viewLifecycleOwner, { orientation -> - polarView?.setOrientation(orientation.first, orientation.second, orientation.third) + passInfoView?.setOrientation(orientation.first, orientation.second, orientation.third) }) } private fun observeTransmitters( satPass: SatPass, - transAdapter: TransAdapter, + satTransAdapter: SatTransAdapter, binding: FragmentPolarBinding ) { viewModel.transmitters.observe(viewLifecycleOwner, { list -> if (list.isNotEmpty()) { - transAdapter.submitList(list) + satTransAdapter.submitList(list) binding.recycler.visibility = View.VISIBLE binding.noTransMsg.visibility = View.INVISIBLE } else { @@ -93,6 +93,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar) { binding.noTransMsg.visibility = View.VISIBLE } setPassText(satPass, binding) + passInfoView?.invalidate() }) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoView.kt similarity index 98% rename from app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoView.kt index dfdf3c47..f7b4d4de 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoView.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.polarScreen +package com.rtbishop.look4sat.presentation.satPassInfoScreen import android.content.Context import android.graphics.* @@ -27,7 +27,7 @@ import java.util.* import kotlin.math.cos import kotlin.math.sin -class PolarView(context: Context) : View(context) { +class PassInfoView(context: Context) : View(context) { private lateinit var satPass: SatPass private val polarWidth = resources.displayMetrics.widthPixels diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoViewModel.kt similarity index 80% rename from app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoViewModel.kt index 7fd10de4..9e95c9b3 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/PassInfoViewModel.kt @@ -15,13 +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.polarScreen +package com.rtbishop.look4sat.presentation.satPassInfoScreen import androidx.lifecycle.* -import com.rtbishop.look4sat.data.PassesRepo -import com.rtbishop.look4sat.data.PreferenceSource -import com.rtbishop.look4sat.data.SatelliteRepo -import com.rtbishop.look4sat.di.IoDispatcher +import com.rtbishop.look4sat.data.SatPassRepository +import com.rtbishop.look4sat.data.PreferencesSource +import com.rtbishop.look4sat.data.SatDataRepository +import com.rtbishop.look4sat.injection.IoDispatcher import com.rtbishop.look4sat.domain.model.SatTrans import com.rtbishop.look4sat.domain.predict4kotlin.SatPass import com.rtbishop.look4sat.framework.OrientationProvider @@ -35,11 +35,11 @@ import java.util.* import javax.inject.Inject @HiltViewModel -class PolarViewModel @Inject constructor( +class PassInfoViewModel @Inject constructor( private val orientationProvider: OrientationProvider, - private val preferenceSource: PreferenceSource, - private val passesRepo: PassesRepo, - private val satelliteRepo: SatelliteRepo, + private val preferencesSource: PreferencesSource, + private val satPassRepository: SatPassRepository, + private val satDataRepository: SatDataRepository, @IoDispatcher private val ioDispatcher: CoroutineDispatcher ) : ViewModel(), OrientationProvider.OrientationListener { @@ -49,7 +49,7 @@ class PolarViewModel @Inject constructor( val orientation: LiveData> = _orientation fun getPass(catNum: Int, aosTime: Long) = liveData { - passesRepo.passes.collect { passes -> + satPassRepository.passes.collect { passes -> val pass = passes.find { it.catNum == catNum && it.aosDate.time == aosTime } pass?.let { satPass -> processTransmitters(satPass) @@ -60,20 +60,20 @@ class PolarViewModel @Inject constructor( } fun enableSensor() { - if (preferenceSource.shouldUseCompass()) orientationProvider.startListening(this) + if (preferencesSource.shouldUseCompass()) orientationProvider.startListening(this) } fun disableSensor() { - if (preferenceSource.shouldUseCompass()) orientationProvider.stopListening() + if (preferencesSource.shouldUseCompass()) orientationProvider.stopListening() } override fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float) { - _orientation.value = Triple(azimuth + preferenceSource.getMagDeclination(), pitch, roll) + _orientation.value = Triple(azimuth + preferencesSource.getMagDeclination(), pitch, roll) } private fun initRotatorControl(satPass: SatPass) { viewModelScope.launch { - val rotatorPrefs = preferenceSource.getRotatorServer() + val rotatorPrefs = preferencesSource.getRotatorServer() if (rotatorPrefs != null) { runCatching { withContext(ioDispatcher) { @@ -97,7 +97,7 @@ class PolarViewModel @Inject constructor( private fun processTransmitters(satPass: SatPass) { viewModelScope.launch { - satelliteRepo.getSatTransmitters(satPass.catNum).collect { transList -> + satDataRepository.getSatTransmitters(satPass.catNum).collect { transList -> while (isActive) { val timeNow = Date() val copiedList = transList.map { it.copy() } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/TransAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt similarity index 96% rename from app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/TransAdapter.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.kt index b8d53a10..db51dbc6 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/TransAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassInfoScreen/SatTransAdapter.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.polarScreen +package com.rtbishop.look4sat.presentation.satPassInfoScreen import android.view.LayoutInflater import android.view.ViewGroup @@ -27,7 +27,7 @@ import com.rtbishop.look4sat.databinding.ItemTransBinding import com.rtbishop.look4sat.domain.model.SatTrans import java.util.* -class TransAdapter : RecyclerView.Adapter() { +class SatTransAdapter : RecyclerView.Adapter() { private val diffCallback = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SatTrans, newItem: SatTrans): Boolean { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassAdapter.kt similarity index 97% rename from app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesAdapter.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassAdapter.kt index 71f10542..e14d5d91 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassAdapter.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.satPassScreen import android.view.LayoutInflater import android.view.ViewGroup @@ -29,7 +29,7 @@ import com.rtbishop.look4sat.domain.predict4kotlin.SatPass import java.text.SimpleDateFormat import java.util.* -class PassesAdapter(private val isUTC: Boolean, private val clickListener: PassesClickListener) : +class SatPassAdapter(private val isUTC: Boolean, private val clickListener: PassesClickListener) : RecyclerView.Adapter() { private val diffCallback = object : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassFragment.kt similarity index 92% rename from app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassFragment.kt index acb0811c..e608d317 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassFragment.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.satPassScreen import android.os.Bundle import android.view.View @@ -36,9 +36,9 @@ import dagger.hilt.android.AndroidEntryPoint import java.util.* @AndroidEntryPoint -class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesClickListener { +class SatPassFragment : Fragment(R.layout.fragment_passes), SatPassAdapter.PassesClickListener { - private val viewModel: PassesViewModel by viewModels() + private val viewModel: SatPassViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -46,7 +46,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC } private fun setupComponents(view: View) { - val passesAdapter = PassesAdapter(viewModel.shouldUseUTC(), this) + val passesAdapter = SatPassAdapter(viewModel.shouldUseUTC(), this) val binding = FragmentPassesBinding.bind(view).apply { passesRecycler.apply { setHasFixedSize(true) @@ -65,12 +65,12 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC private fun handleNewPasses( result: Result>, - passesAdapter: PassesAdapter, + satPassAdapter: SatPassAdapter, binding: FragmentPassesBinding ) { when (result) { is Result.Success -> { - passesAdapter.submitList(result.data) + satPassAdapter.submitList(result.data) binding.apply { passesError.visibility = View.INVISIBLE passesProgress.visibility = View.INVISIBLE diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassViewModel.kt similarity index 81% rename from app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassViewModel.kt index b1dc7196..43a4dbe4 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/satPassScreen/SatPassViewModel.kt @@ -15,16 +15,16 @@ * 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.satPassScreen import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.rtbishop.look4sat.data.PassesRepo -import com.rtbishop.look4sat.data.SatelliteRepo +import com.rtbishop.look4sat.data.PreferencesSource +import com.rtbishop.look4sat.data.SatDataRepository +import com.rtbishop.look4sat.data.SatPassRepository import com.rtbishop.look4sat.domain.predict4kotlin.SatPass -import com.rtbishop.look4sat.framework.PreferencesProvider import com.rtbishop.look4sat.framework.model.Result import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* @@ -32,10 +32,10 @@ import kotlinx.coroutines.flow.collect import javax.inject.Inject @HiltViewModel -class PassesViewModel @Inject constructor( - private val satelliteRepo: SatelliteRepo, - private val passesRepo: PassesRepo, - private val preferenceSource: PreferencesProvider +class SatPassViewModel @Inject constructor( + private val satDataRepository: SatDataRepository, + private val satPassRepository: SatPassRepository, + private val preferenceSource: PreferencesSource ) : ViewModel() { private val _passes = MutableLiveData>>(Result.InProgress) @@ -45,10 +45,10 @@ class PassesViewModel @Inject constructor( init { viewModelScope.launch { _passes.postValue(Result.InProgress) - passesRepo.triggerCalculation(satelliteRepo.getSelectedSatellites()) + satPassRepository.triggerCalculation(satDataRepository.getSelectedSatellites()) } viewModelScope.launch { - passesRepo.passes.collect { passes -> + satPassRepository.passes.collect { passes -> passesProcessing?.cancelAndJoin() passesProcessing = viewModelScope.launch { tickPasses(passes) } } @@ -59,7 +59,7 @@ class PassesViewModel @Inject constructor( viewModelScope.launch { _passes.postValue(Result.InProgress) passesProcessing?.cancelAndJoin() - passesRepo.forceCalculation(satelliteRepo.getSelectedSatellites()) + satPassRepository.forceCalculation(satDataRepository.getSelectedSatellites()) } } diff --git a/app/src/main/res/layout/fragment_info.xml b/app/src/main/res/layout/fragment_info.xml index 5435fefc..a2281a44 100644 --- a/app/src/main/res/layout/fragment_info.xml +++ b/app/src/main/res/layout/fragment_info.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".presentation.infoScreen.InfoFragment"> + tools:context=".presentation.appInfoScreen.AppInfoFragment"> + android:name="com.rtbishop.look4sat.presentation.appSettingsScreen.AppSettingsFragment" /> diff --git a/core/src/main/java/com/rtbishop/look4sat/data/PreferenceSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/PreferencesSource.kt similarity index 96% rename from core/src/main/java/com/rtbishop/look4sat/data/PreferenceSource.kt rename to core/src/main/java/com/rtbishop/look4sat/data/PreferencesSource.kt index 879cf7db..55c756b9 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/PreferenceSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/PreferencesSource.kt @@ -2,7 +2,7 @@ package com.rtbishop.look4sat.data import com.rtbishop.look4sat.domain.predict4kotlin.StationPosition -interface PreferenceSource { +interface PreferencesSource { fun positionToQTH(lat: Double, lon: Double): String? diff --git a/core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/SatDataLocalSource.kt similarity index 95% rename from core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt rename to core/src/main/java/com/rtbishop/look4sat/data/SatDataLocalSource.kt index 914d61f4..5ac004c6 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/LocalDataSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/SatDataLocalSource.kt @@ -6,7 +6,7 @@ import com.rtbishop.look4sat.domain.model.SatTrans import com.rtbishop.look4sat.domain.predict4kotlin.Satellite import kotlinx.coroutines.flow.Flow -interface LocalDataSource { +interface SatDataLocalSource { fun getSatItems(): Flow> diff --git a/core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt b/core/src/main/java/com/rtbishop/look4sat/data/SatDataRemoteSource.kt similarity index 87% rename from core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt rename to core/src/main/java/com/rtbishop/look4sat/data/SatDataRemoteSource.kt index cfbcdbf6..927527c1 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/RemoteDataSource.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/SatDataRemoteSource.kt @@ -3,7 +3,7 @@ package com.rtbishop.look4sat.data import com.rtbishop.look4sat.domain.model.SatTrans import java.io.InputStream -interface RemoteDataSource { +interface SatDataRemoteSource { suspend fun fetchDataStream(url: String): InputStream? diff --git a/core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt b/core/src/main/java/com/rtbishop/look4sat/data/SatDataRepository.kt similarity index 58% rename from core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt rename to core/src/main/java/com/rtbishop/look4sat/data/SatDataRepository.kt index c7ef6dde..388fbac0 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/SatelliteRepo.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/SatDataRepository.kt @@ -12,9 +12,10 @@ import kotlinx.coroutines.withContext import java.io.InputStream import java.util.zip.ZipInputStream -class SatelliteRepo( - private val localSource: LocalDataSource, - private val remoteSource: RemoteDataSource, +class SatDataRepository( + private val preferencesSource: PreferencesSource, + private val satLocalSource: SatDataLocalSource, + private val satRemoteSource: SatDataRemoteSource, private val ioDispatcher: CoroutineDispatcher ) { private val defaultSources = listOf( @@ -24,20 +25,40 @@ class SatelliteRepo( "https://www.prismnet.com/~mmccants/tles/inttles.zip" ) + private val transmittersModes = arrayOf( + "AFSK", "AFSK S-Net", "AFSK SALSAT", "AHRPT", "AM", "APT", "BPSK", "BPSK PMT-A3", + "CERTO", "CW", "DQPSK", "DSTAR", "DUV", "FFSK", "FM", "FMN", "FSK", "FSK AX.100 Mode 5", + "FSK AX.100 Mode 6", "FSK AX.25 G3RUH", "GFSK", "GFSK Rktr", "GMSK", "HRPT", "LoRa", + "LRPT", "LSB", "MFSK", "MSK", "MSK AX.100 Mode 5", "MSK AX.100 Mode 6", "OFDM", "OQPSK", + "PSK", "PSK31", "PSK63", "QPSK", "QPSK31", "QPSK63", "SSTV", "USB", "WSJT" + ) + + fun getAllModes(): Array { + return transmittersModes + } + + fun saveModesSelection(modes: List) { + preferencesSource.saveModesSelection(modes) + } + + fun loadModesSelection(): List { + return preferencesSource.loadModesSelection() + } + fun getSatItems(): Flow> { - return localSource.getSatItems() + return satLocalSource.getSatItems() } fun getSatTransmitters(catNum: Int): Flow> { - return localSource.getSatTransmitters(catNum) + return satLocalSource.getSatTransmitters(catNum) } suspend fun getSelectedSatellites(): List { - return localSource.getSelectedSatellites() + return satLocalSource.getSelectedSatellites() } suspend fun updateEntriesFromFile(stream: InputStream) = withContext(ioDispatcher) { - localSource.updateEntries(importSatEntries(stream)) + satLocalSource.updateEntries(importSatEntries(stream)) } suspend fun updateEntriesFromWeb(sources: List = defaultSources) { @@ -46,7 +67,7 @@ class SatelliteRepo( val streams = mutableListOf() val entries = mutableListOf() sources.forEach { source -> - remoteSource.fetchDataStream(source)?.let { stream -> + satRemoteSource.fetchDataStream(source)?.let { stream -> if (source.contains(".zip", true)) { val zipStream = ZipInputStream(stream).apply { nextEntry } streams.add(zipStream) @@ -56,17 +77,17 @@ class SatelliteRepo( } } streams.forEach { stream -> entries.addAll(importSatEntries(stream)) } - localSource.updateEntries(entries) + satLocalSource.updateEntries(entries) } launch(ioDispatcher) { - val transmitters = remoteSource.fetchTransmitters().filter { it.isAlive } - localSource.updateTransmitters(transmitters) + val transmitters = satRemoteSource.fetchTransmitters().filter { it.isAlive } + satLocalSource.updateTransmitters(transmitters) } } } suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { - localSource.updateEntriesSelection(catNums, isSelected) + satLocalSource.updateEntriesSelection(catNums, isSelected) } private fun importSatEntries(stream: InputStream): List { diff --git a/core/src/main/java/com/rtbishop/look4sat/data/PassesRepo.kt b/core/src/main/java/com/rtbishop/look4sat/data/SatPassRepository.kt similarity index 86% rename from core/src/main/java/com/rtbishop/look4sat/data/PassesRepo.kt rename to core/src/main/java/com/rtbishop/look4sat/data/SatPassRepository.kt index 23de9cf7..8aef96d0 100644 --- a/core/src/main/java/com/rtbishop/look4sat/data/PassesRepo.kt +++ b/core/src/main/java/com/rtbishop/look4sat/data/SatPassRepository.kt @@ -25,8 +25,8 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.withContext import java.util.* -class PassesRepo( - private val preferenceSource: PreferenceSource, +class SatPassRepository( + private val preferencesSource: PreferencesSource, private val defaultDispatcher: CoroutineDispatcher ) { private val _passes = MutableSharedFlow>(replay = 1) @@ -57,15 +57,15 @@ class PassesRepo( } private fun getPasses(satellite: Satellite, refDate: Date): List { - val predictor = satellite.getPredictor(preferenceSource.loadStationPosition()) - return predictor.getPasses(refDate, preferenceSource.getHoursAhead(), true) + val predictor = satellite.getPredictor(preferencesSource.loadStationPosition()) + return predictor.getPasses(refDate, preferencesSource.getHoursAhead(), true) } private fun filterPasses(passes: List, refDate: Date): List { - val timeFuture = Date(refDate.time + (preferenceSource.getHoursAhead() * 3600 * 1000)) + val timeFuture = Date(refDate.time + (preferencesSource.getHoursAhead() * 3600 * 1000)) return passes.filter { it.losDate.after(refDate) } .filter { it.aosDate.before(timeFuture) } - .filter { it.maxElevation > preferenceSource.getMinElevation() } + .filter { it.maxElevation > preferencesSource.getMinElevation() } .sortedBy { it.aosDate } } }