Changes to DAO and file structure

This commit is contained in:
Arty Bishop committed 2021-03-18 20:40:09 +00:00
1 parent 31ed6230ba
commit 46f1ea9880
29 files changed
+139 -103

No files matched your search

@@ -15,9 +15,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository.remoteData
package com.rtbishop.look4sat.data.api
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.data.model.SatTrans
import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.http.GET
@@ -25,10 +25,10 @@ import retrofit2.http.Streaming
import retrofit2.http.Url
interface SatelliteService {
@Streaming
@GET
suspend fun fetchFile(@Url fileUrl: String): Response<ResponseBody>
suspend fun fetchFileByUrl(@Url url: String): Response<ResponseBody>
@GET("transmitters/")
suspend fun fetchTransmitters(): List<SatTrans>
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository.localData
package com.rtbishop.look4sat.data.database
import androidx.room.TypeConverter
import com.github.amsacode.predict4java.Satellite
@@ -15,26 +15,22 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository.localData
package com.rtbishop.look4sat.data.database
import androidx.room.*
import com.github.amsacode.predict4java.Satellite
import com.rtbishop.look4sat.data.SatEntry
import com.rtbishop.look4sat.data.SatItem
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.data.model.SatEntry
import com.rtbishop.look4sat.data.model.SatItem
import com.rtbishop.look4sat.data.model.SatTrans
import kotlinx.coroutines.flow.Flow
@Dao
interface SatelliteDao {
@Query("SELECT * FROM entries ORDER BY name ASC")
fun getEntries(): Flow<List<SatEntry>>
// Query
@Query("SELECT catNum, name, isSelected FROM entries ORDER BY name ASC")
fun getSatItems(): Flow<List<SatItem>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertEntries(entries: List<SatEntry>)
fun getAllSatItems(): Flow<List<SatItem>>
@Query("SELECT tle FROM entries WHERE isSelected = 1")
suspend fun getSelectedSatellites(): List<Satellite>
@@ -42,21 +38,47 @@ interface SatelliteDao {
@Query("SELECT catNum FROM entries WHERE isSelected = 1")
suspend fun getSelectedCatNums(): List<Int>
@Transaction
suspend fun updateEntriesSelection(catNums: List<Int>) {
clearSelection()
catNums.forEach { catNum -> updateSelection(catNum) }
}
@Query("SELECT * FROM transmitters WHERE isAlive = 1 ORDER BY mode ASC")
fun getAllTransmitters(): Flow<List<SatTrans>>
@Query("UPDATE entries SET isSelected = 0")
suspend fun clearSelection()
@Query("SELECT * FROM transmitters WHERE isAlive = 1 and catNum = :catNum")
fun getTransmittersByCatNum(catNum: Int): Flow<List<SatTrans>>
@Query("UPDATE entries SET isSelected = 1 WHERE catNum = :catNum")
suspend fun updateSelection(catNum: Int)
// Insert
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertEntries(entries: List<SatEntry>)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertTransmitters(transmitters: List<SatTrans>)
@Query("SELECT * FROM transmitters WHERE isAlive = 1 and catNum = :catNum")
fun getTransmittersForSat(catNum: Int): Flow<List<SatTrans>>
// Update
@Query("UPDATE entries SET isSelected = 0")
suspend fun clearSelection()
@Query("UPDATE entries SET isSelected = :isSelected WHERE catNum = :catNum")
suspend fun updateSelectionByCatNum(catNum: Int, isSelected: Boolean)
@Transaction
suspend fun updateSelection(catNums: List<Int>) {
clearSelection()
catNums.forEach { catNum ->
updateSelectionByCatNum(catNum, true)
}
}
// Delete
@Query("DELETE from entries")
suspend fun deleteEntries()
@Query("DELETE from transmitters")
suspend fun deleteTransmitters()
@Transaction
suspend fun deleteAllData() {
deleteEntries()
deleteTransmitters()
}
}
@@ -15,15 +15,15 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository.localData
package com.rtbishop.look4sat.data.database
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.rtbishop.look4sat.data.SatEntry
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.data.model.SatEntry
import com.rtbishop.look4sat.data.model.SatTrans
@Database(entities = [SatEntry::class, SatTrans::class], version = 2)
@TypeConverters(RoomConverters::class)
@@ -15,10 +15,10 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()
object InProgress : Result<Nothing>()
}
}
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@@ -27,4 +27,4 @@ class SatEntry(
var isSelected: Boolean = false,
@PrimaryKey val catNum: Int = tle.catnum,
val name: String = tle.name
)
)
@@ -15,6 +15,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
class SatItem(val catNum: Int, val name: String, var isSelected: Boolean)
class SatItem(val catNum: Int, val name: String, var isSelected: Boolean)
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
import com.github.amsacode.predict4java.SatPassTime
import com.github.amsacode.predict4java.TLE
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
import com.github.amsacode.predict4java.Position
import org.osmdroid.views.overlay.Overlay
@@ -32,4 +32,4 @@ class SelectedSat(
val coverage: Double,
val footprint: Overlay,
val groundTrack: Overlay
)
)
@@ -15,6 +15,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data
package com.rtbishop.look4sat.data.model
class TleSource(var url: String = String())
class TleSource(var url: String = String())
@@ -15,13 +15,30 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository
/*
* Look4Sat. Amateur radio satellite tracker and pass predictor.
* Copyright (C) 2019-2021 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 <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.data.repository
import android.content.SharedPreferences
import android.hardware.GeomagneticField
import androidx.core.content.edit
import com.github.amsacode.predict4java.GroundStationPosition
import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.data.model.TleSource
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import javax.inject.Inject
@@ -15,18 +15,18 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.rtbishop.look4sat.repository
package com.rtbishop.look4sat.data.repository
import android.content.ContentResolver
import android.net.Uri
import com.github.amsacode.predict4java.Satellite
import com.github.amsacode.predict4java.TLE
import com.rtbishop.look4sat.data.SatEntry
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.data.model.SatEntry
import com.rtbishop.look4sat.data.model.SatTrans
import com.rtbishop.look4sat.data.model.TleSource
import com.rtbishop.look4sat.di.IoDispatcher
import com.rtbishop.look4sat.repository.localData.SatelliteDao
import com.rtbishop.look4sat.repository.remoteData.SatelliteService
import com.rtbishop.look4sat.data.database.SatelliteDao
import com.rtbishop.look4sat.data.api.SatelliteService
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
@@ -45,10 +45,10 @@ class SatelliteRepo @Inject constructor(
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
) {
val satDataFlow = satelliteDao.getSatItems()
val satDataFlow = satelliteDao.getAllSatItems()
fun getTransmittersForSat(catNum: Int): Flow<List<SatTrans>> {
return satelliteDao.getTransmittersForSat(catNum)
return satelliteDao.getTransmittersByCatNum(catNum)
}
suspend fun getSelectedSatellites(): List<Satellite> {
@@ -56,7 +56,7 @@ class SatelliteRepo @Inject constructor(
}
suspend fun updateEntriesSelection(catNums: List<Int>) {
satelliteDao.updateEntriesSelection(catNums)
satelliteDao.updateSelection(catNums)
}
suspend fun updateSatDataFromFile(uri: Uri) {
@@ -91,13 +91,14 @@ class SatelliteRepo @Inject constructor(
private suspend fun getStreamsForSources(sources: List<TleSource>): List<InputStream> {
val streams = mutableListOf<InputStream>()
sources.forEach { tleSource ->
satelliteService.fetchFile(tleSource.url).body()?.byteStream()?.let { inputStream ->
if (tleSource.url.contains(".zip", true)) {
streams.add(getZipStream(inputStream))
} else {
streams.add(inputStream)
satelliteService.fetchFileByUrl(tleSource.url).body()?.byteStream()
?.let { inputStream ->
if (tleSource.url.contains(".zip", true)) {
streams.add(getZipStream(inputStream))
} else {
streams.add(inputStream)
}
}
}
}
return streams
}
@@ -127,6 +128,6 @@ class SatelliteRepo @Inject constructor(
private suspend fun insertEntriesAndRestoreSelection(entries: List<SatEntry>) {
val selectedCatNums = satelliteDao.getSelectedCatNums()
satelliteDao.insertEntries(entries)
satelliteDao.updateEntriesSelection(selectedCatNums)
satelliteDao.updateSelection(selectedCatNums)
}
}
@@ -22,19 +22,13 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import javax.inject.Qualifier
@Module
@InstallIn(SingletonComponent::class)
object CoroutinesModule {
@Provides
@ExternalScope
fun provideExternalScope(): CoroutineScope = CoroutineScope(SupervisorJob())
@Provides
@DefaultDispatcher
fun provideDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default
@@ -48,10 +42,6 @@ object CoroutinesModule {
fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main
}
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class ExternalScope
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class DefaultDispatcher
@@ -62,4 +52,4 @@ annotation class IoDispatcher
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class MainDispatcher
annotation class MainDispatcher
@@ -17,7 +17,7 @@
*/
package com.rtbishop.look4sat.di
import com.rtbishop.look4sat.repository.remoteData.SatelliteService
import com.rtbishop.look4sat.data.api.SatelliteService
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
@@ -19,10 +19,10 @@ package com.rtbishop.look4sat.di
import android.content.Context
import androidx.room.Room
import com.rtbishop.look4sat.repository.localData.MIGRATION_1_2
import com.rtbishop.look4sat.repository.localData.RoomConverters
import com.rtbishop.look4sat.repository.localData.SatelliteDao
import com.rtbishop.look4sat.repository.localData.SatelliteDb
import com.rtbishop.look4sat.data.database.MIGRATION_1_2
import com.rtbishop.look4sat.data.database.RoomConverters
import com.rtbishop.look4sat.data.database.SatelliteDao
import com.rtbishop.look4sat.data.database.SatelliteDb
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
@@ -23,7 +23,7 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ActivityMainBinding
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.PrefsRepo
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@@ -20,12 +20,12 @@ package com.rtbishop.look4sat.ui
import android.net.Uri
import androidx.lifecycle.*
import com.github.amsacode.predict4java.Satellite
import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatItem
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.repository.SatelliteRepo
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.SatItem
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.data.model.TleSource
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.SatelliteRepo
import com.rtbishop.look4sat.utility.getPredictor
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
@@ -21,7 +21,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.SearchView
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.data.SatItem
import com.rtbishop.look4sat.data.model.SatItem
import com.rtbishop.look4sat.databinding.ItemSatEntryBinding
import java.util.*
@@ -27,7 +27,7 @@ import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.databinding.FragmentEntriesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.RecyclerDivider
@@ -28,13 +28,14 @@ import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import com.github.amsacode.predict4java.Position
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.SelectedSat
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.data.model.SelectedSat
import com.rtbishop.look4sat.databinding.FragmentMapBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.PrefsRepo
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.ITileSource
import org.osmdroid.tileprovider.tilesource.TileSourcePolicy
@@ -47,6 +48,7 @@ import timber.log.Timber
import java.util.*
import javax.inject.Inject
@FlowPreview
@AndroidEntryPoint
class MapFragment : Fragment(R.layout.fragment_map) {
@@ -25,9 +25,9 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.github.amsacode.predict4java.Position
import com.github.amsacode.predict4java.SatPos
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.SelectedSat
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.data.model.SelectedSat
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.utility.QthConverter
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
@@ -24,7 +24,7 @@ import androidx.core.os.bundleOf
import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.databinding.ItemPassGeoBinding
import com.rtbishop.look4sat.databinding.ItemPassLeoBinding
import com.rtbishop.look4sat.utility.navigateSafe
@@ -24,17 +24,19 @@ import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.databinding.FragmentPassesBinding
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.utility.RecyclerDivider
import com.rtbishop.look4sat.utility.formatForTimer
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview
import java.util.*
import javax.inject.Inject
@FlowPreview
@AndroidEntryPoint
class PassesFragment : Fragment(R.layout.fragment_passes) {
@@ -30,18 +30,20 @@ import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.Result
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.model.Result
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.databinding.FragmentPolarBinding
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.ui.SharedViewModel
import com.rtbishop.look4sat.utility.RecyclerDivider
import com.rtbishop.look4sat.utility.formatForTimer
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview
import java.util.*
import javax.inject.Inject
import kotlin.math.round
@FlowPreview
@AndroidEntryPoint
class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener {
@@ -25,7 +25,7 @@ import android.graphics.Path
import android.view.View
import androidx.core.content.ContextCompat
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.model.SatPass
import java.util.*
import kotlin.math.cos
import kotlin.math.sin
@@ -22,8 +22,8 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.SatPass
import com.rtbishop.look4sat.data.SatTrans
import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.data.model.SatTrans
import com.rtbishop.look4sat.databinding.ItemTransBinding
import java.util.*
@@ -28,7 +28,7 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.google.android.material.snackbar.Snackbar
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.repository.PrefsRepo
import com.rtbishop.look4sat.data.repository.PrefsRepo
import com.rtbishop.look4sat.utility.QthConverter
import com.rtbishop.look4sat.utility.round
import dagger.hilt.android.AndroidEntryPoint
@@ -21,7 +21,7 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.widget.doOnTextChanged
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.data.TleSource
import com.rtbishop.look4sat.data.model.TleSource
import com.rtbishop.look4sat.databinding.ItemTleSourceBinding
class SourcesAdapter : RecyclerView.Adapter<SourcesAdapter.TleSourceHolder>() {