Switched to GridLayoutManager in entries recycler, classes moved

This commit is contained in:
Arty Bishop committed 2021-10-27 21:47:02 +01:00
1 parent db8fe3ce8d
commit af7e027350
51 files changed
+264 -251

No files matched your search

@@ -20,9 +20,9 @@ package com.rtbishop.look4sat.framework
import com.rtbishop.look4sat.framework.model.SatEntry
import com.rtbishop.look4sat.framework.model.SatItem
import com.rtbishop.look4sat.framework.model.Transmitter
import com.rtbishop.look4sat.model.SatEntry as DomainEntry
import com.rtbishop.look4sat.model.SatItem as DomainItem
import com.rtbishop.look4sat.model.Transmitter as DomainTrans
import com.rtbishop.look4sat.domain.model.SatEntry as DomainEntry
import com.rtbishop.look4sat.domain.model.SatItem as DomainItem
import com.rtbishop.look4sat.domain.model.Transmitter as DomainTrans
object DataMapper {
@@ -21,8 +21,8 @@ import android.content.SharedPreferences
import android.hardware.GeomagneticField
import android.location.LocationManager
import androidx.core.content.edit
import com.rtbishop.look4sat.common.Constants
import com.rtbishop.look4sat.predict4kotlin.GeoPos
import com.rtbishop.look4sat.domain.Constants
import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.QthConverter
import com.rtbishop.look4sat.utility.round
import com.squareup.moshi.Moshi
@@ -18,8 +18,8 @@
package com.rtbishop.look4sat.framework.local
import androidx.room.TypeConverter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.predict4kotlin.TLE
import com.rtbishop.look4sat.domain.predict.Satellite
import com.rtbishop.look4sat.domain.predict.TLE
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
@@ -18,10 +18,10 @@
package com.rtbishop.look4sat.framework.local
import com.rtbishop.look4sat.data.LocalDataSource
import com.rtbishop.look4sat.model.SatEntry
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.domain.model.SatEntry
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.predict.Satellite
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.framework.DataMapper
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
@@ -21,7 +21,7 @@ import androidx.room.*
import com.rtbishop.look4sat.framework.model.SatEntry
import com.rtbishop.look4sat.framework.model.SatItem
import com.rtbishop.look4sat.framework.model.Transmitter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow
@Dao
@@ -19,7 +19,7 @@ package com.rtbishop.look4sat.framework.model
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.rtbishop.look4sat.predict4kotlin.TLE
import com.rtbishop.look4sat.domain.predict.TLE
@Entity(tableName = "entries")
data class SatEntry(
@@ -18,7 +18,7 @@
package com.rtbishop.look4sat.framework.remote
import com.rtbishop.look4sat.data.RemoteDataSource
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.framework.DataMapper
import java.io.InputStream
@@ -1,55 +0,0 @@
/*
* 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.injection
import android.content.ContentResolver
import android.content.Context
import android.content.SharedPreferences
import android.hardware.SensorManager
import android.location.LocationManager
import androidx.preference.PreferenceManager
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object AndroidModule {
@Provides
fun provideContentResolver(@ApplicationContext context: Context): ContentResolver {
return context.contentResolver
}
@Provides
fun provideLocationManager(@ApplicationContext context: Context): LocationManager {
return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
}
@Provides
fun provideSensorManager(@ApplicationContext context: Context): SensorManager {
return context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
}
@Provides
fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
}
@@ -17,35 +17,53 @@
*/
package com.rtbishop.look4sat.injection
import android.content.ContentResolver
import android.content.Context
import android.content.SharedPreferences
import android.hardware.SensorManager
import android.location.LocationManager
import androidx.preference.PreferenceManager
import androidx.room.Room
import com.rtbishop.look4sat.data.LocalDataSource
import com.rtbishop.look4sat.data.RemoteDataSource
import com.rtbishop.look4sat.data.DataRepository
import com.rtbishop.look4sat.framework.remote.SatelliteApi
import com.rtbishop.look4sat.common.Constants
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.domain.Constants
import com.rtbishop.look4sat.framework.PreferencesSource
import com.rtbishop.look4sat.domain.DataReporter
import com.rtbishop.look4sat.predict4kotlin.Predictor
import com.rtbishop.look4sat.framework.remote.RemoteSource
import com.rtbishop.look4sat.framework.local.*
import com.rtbishop.look4sat.framework.local.Converters
import com.rtbishop.look4sat.framework.local.MIGRATION_1_2
import com.rtbishop.look4sat.framework.local.SatelliteDao
import com.rtbishop.look4sat.framework.local.SatelliteDb
import com.rtbishop.look4sat.framework.remote.SatelliteApi
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object Look4SatModule {
object AppModule {
@Provides
fun provideContentResolver(@ApplicationContext context: Context): ContentResolver {
return context.contentResolver
}
@Provides
fun provideLocationManager(@ApplicationContext context: Context): LocationManager {
return context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
}
@Provides
fun provideSensorManager(@ApplicationContext context: Context): SensorManager {
return context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
}
@Provides
fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context)
}
@Provides
@Singleton
@@ -65,23 +83,11 @@ object Look4SatModule {
@Provides
@Singleton
fun providePredictor(@DefaultDispatcher dispatcher: CoroutineDispatcher): Predictor {
return Predictor(dispatcher)
}
@Provides
@Singleton
fun provideSatelliteRepo(
localSource: LocalDataSource,
remoteSource: RemoteDataSource,
@IoDispatcher dispatcher: CoroutineDispatcher
): Repository {
return DataRepository(localSource, remoteSource, dispatcher)
}
@Provides
fun provideLocalDataSource(satelliteDao: SatelliteDao): LocalDataSource {
return LocalSource(satelliteDao)
fun provideSatelliteApi(): SatelliteApi {
return Retrofit.Builder()
.baseUrl(Constants.URL_BASE)
.addConverterFactory(MoshiConverterFactory.create())
.build().create(SatelliteApi::class.java)
}
@Provides
@@ -97,25 +103,4 @@ object Look4SatModule {
return Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb")
.addMigrations(MIGRATION_1_2).build()
}
@Provides
@Singleton
fun provideRemoteDataSource(satelliteApi: SatelliteApi): RemoteDataSource {
return RemoteSource(satelliteApi)
}
@Provides
@Singleton
fun provideSatelliteService(): SatelliteApi {
return Retrofit.Builder()
.baseUrl(Constants.URL_BASE)
.addConverterFactory(MoshiConverterFactory.create())
.build().create(SatelliteApi::class.java)
}
@Provides
@Singleton
fun provideDataReporter(@IoDispatcher dispatcher: CoroutineDispatcher): DataReporter {
return DataReporter(dispatcher)
}
}
@@ -0,0 +1,72 @@
/*
* 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.injection
import com.rtbishop.look4sat.data.LocalDataSource
import com.rtbishop.look4sat.data.RemoteDataSource
import com.rtbishop.look4sat.data.DataRepository
import com.rtbishop.look4sat.framework.remote.SatelliteApi
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.domain.DataReporter
import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.framework.remote.RemoteSource
import com.rtbishop.look4sat.framework.local.*
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object CoreModule {
@Provides
fun provideLocalDataSource(satelliteDao: SatelliteDao): LocalDataSource {
return LocalSource(satelliteDao)
}
@Provides
@Singleton
fun provideRemoteDataSource(satelliteApi: SatelliteApi): RemoteDataSource {
return RemoteSource(satelliteApi)
}
@Provides
@Singleton
fun provideSatelliteRepo(
localSource: LocalDataSource,
remoteSource: RemoteDataSource,
@IoDispatcher dispatcher: CoroutineDispatcher
): SatelliteRepo {
return DataRepository(localSource, remoteSource, dispatcher)
}
@Provides
@Singleton
fun providePredictor(@DefaultDispatcher dispatcher: CoroutineDispatcher): Predictor {
return Predictor(dispatcher)
}
@Provides
@Singleton
fun provideDataReporter(@IoDispatcher dispatcher: CoroutineDispatcher): DataReporter {
return DataReporter(dispatcher)
}
}
@@ -22,7 +22,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.databinding.ItemEntryBinding
class EntriesAdapter(private val clickListener: EntriesClickListener) :
@@ -57,7 +57,7 @@ class EntriesAdapter(private val clickListener: EntriesClickListener) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: SatItem, listener: EntriesClickListener) {
binding.entryCheckbox.text = item.name
binding.entryName.text = item.name
binding.entryCheckbox.isChecked = item.isSelected
itemView.setOnClickListener {
listener.updateSelection(listOf(item.catNum), item.isSelected.not())
@@ -23,13 +23,13 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.databinding.FragmentEntriesBinding
import com.rtbishop.look4sat.common.DataState
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.DataState
import com.rtbishop.look4sat.presentation.ItemDivider
import com.rtbishop.look4sat.utility.getNavResult
import com.rtbishop.look4sat.utility.navigateSafe
@@ -51,7 +51,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
}
private fun setupComponents(view: View) {
val entriesAdapter = EntriesAdapter(object: EntriesAdapter.EntriesClickListener {
val entriesAdapter = EntriesAdapter(object : EntriesAdapter.EntriesClickListener {
override fun updateSelection(catNums: List<Int>, isSelected: Boolean) {
viewModel.updateSelection(catNums, isSelected)
}
@@ -60,7 +60,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) {
entriesRecycler.apply {
setHasFixedSize(true)
adapter = entriesAdapter
layoutManager = LinearLayoutManager(requireContext())
layoutManager = GridLayoutManager(requireContext(), 2)
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
addItemDecoration(ItemDivider(R.drawable.rec_divider_light))
}
@@ -21,9 +21,9 @@ import android.content.ContentResolver
import android.net.Uri
import android.widget.SearchView
import androidx.lifecycle.*
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.common.DataState
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.DataState
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.framework.PreferencesSource
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineExceptionHandler
@@ -37,7 +37,7 @@ import javax.inject.Inject
class EntriesViewModel @Inject constructor(
private val preferences: PreferencesSource,
private val resolver: ContentResolver,
private val satelliteRepo: Repository,
private val satelliteRepo: SatelliteRepo,
) : ViewModel(), SearchView.OnQueryTextListener {
private val coroutineHandler = CoroutineExceptionHandler { _, throwable ->
@@ -17,8 +17,8 @@
*/
package com.rtbishop.look4sat.presentation.mapScreen
import com.rtbishop.look4sat.predict4kotlin.GeoPos
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.predict.Satellite
data class MapData(
val pass: Satellite,
@@ -29,8 +29,8 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentMapBinding
import com.rtbishop.look4sat.predict4kotlin.GeoPos
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.predict.Satellite
import dagger.hilt.android.AndroidEntryPoint
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
@@ -18,12 +18,12 @@
package com.rtbishop.look4sat.presentation.mapScreen
import androidx.lifecycle.*
import com.rtbishop.look4sat.predict4kotlin.Predictor
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.framework.PreferencesSource
import com.rtbishop.look4sat.predict4kotlin.GeoPos
import com.rtbishop.look4sat.domain.predict.GeoPos
import com.rtbishop.look4sat.domain.QthConverter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.predict.Satellite
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.*
import java.util.*
@@ -33,7 +33,7 @@ import kotlin.math.min
@HiltViewModel
class MapViewModel @Inject constructor(
private val satelliteRepo: Repository,
private val satelliteRepo: SatelliteRepo,
private val predictor: Predictor,
private val preferences: PreferencesSource,
) : ViewModel() {
@@ -162,7 +162,7 @@ class MapViewModel @Inject constructor(
val osmLat = clipLat(Math.toDegrees(satPos.latitude))
val osmLon = clipLon(Math.toDegrees(satPos.longitude))
val osmPos = GeoPos(osmLat, osmLon)
val qthLoc = QthConverter.positionToQTH(osmPos.latitude, osmPos.longitude) ?: "-- --"
val qthLoc = QthConverter.positionToQth(osmPos.latitude, osmPos.longitude) ?: "-- --"
val satData = MapData(
satellite, satellite.params.catnum, satellite.params.name, satPos.range,
satPos.altitude, satPos.getOrbitalVelocity(), qthLoc, osmPos
@@ -25,7 +25,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ItemPassGeoBinding
import com.rtbishop.look4sat.databinding.ItemPassLeoBinding
import com.rtbishop.look4sat.predict4kotlin.SatPass
import com.rtbishop.look4sat.domain.predict.SatPass
import java.text.SimpleDateFormat
import java.util.*
@@ -29,8 +29,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentPassesBinding
import com.rtbishop.look4sat.predict4kotlin.SatPass
import com.rtbishop.look4sat.common.DataState
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.domain.DataState
import com.rtbishop.look4sat.presentation.ItemDivider
import com.rtbishop.look4sat.utility.navigateSafe
import com.rtbishop.look4sat.utility.toTimerString
@@ -21,10 +21,10 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.rtbishop.look4sat.predict4kotlin.Predictor
import com.rtbishop.look4sat.predict4kotlin.SatPass
import com.rtbishop.look4sat.common.DataState
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.domain.DataState
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.framework.PreferencesSource
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.*
@@ -34,7 +34,7 @@ import javax.inject.Inject
@HiltViewModel
class PassesViewModel @Inject constructor(
private val satelliteRepo: Repository,
private val satelliteRepo: SatelliteRepo,
private val predictor: Predictor,
private val preferences: PreferencesSource
) : ViewModel() {
@@ -17,6 +17,6 @@
*/
package com.rtbishop.look4sat.presentation.radarScreen
import com.rtbishop.look4sat.predict4kotlin.SatPos
import com.rtbishop.look4sat.domain.predict.SatPos
data class RadarData(val satPos: SatPos, val satTrack: List<SatPos> = emptyList())
@@ -27,8 +27,8 @@ import androidx.recyclerview.widget.SimpleItemAnimator
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.FragmentRadarBinding
import com.rtbishop.look4sat.framework.PreferencesSource
import com.rtbishop.look4sat.predict4kotlin.SatPass
import com.rtbishop.look4sat.predict4kotlin.SatPos
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.domain.predict.SatPos
import com.rtbishop.look4sat.presentation.ItemDivider
import com.rtbishop.look4sat.utility.navigateSafe
import com.rtbishop.look4sat.utility.toTimerString
@@ -22,7 +22,7 @@ import android.graphics.*
import android.view.View
import androidx.core.content.ContextCompat
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.predict4kotlin.SatPos
import com.rtbishop.look4sat.domain.predict.SatPos
import kotlin.math.cos
import kotlin.math.min
import kotlin.math.sin
@@ -19,11 +19,11 @@ package com.rtbishop.look4sat.presentation.radarScreen
import androidx.lifecycle.*
import com.rtbishop.look4sat.domain.DataReporter
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.predict4kotlin.Predictor
import com.rtbishop.look4sat.predict4kotlin.SatPass
import com.rtbishop.look4sat.predict4kotlin.SatPos
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.domain.predict.SatPos
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.framework.OrientationSource
import com.rtbishop.look4sat.framework.PreferencesSource
import com.rtbishop.look4sat.utility.round
@@ -40,7 +40,7 @@ class RadarViewModel @Inject constructor(
private val orientationSource: OrientationSource,
private val preferences: PreferencesSource,
private val predictor: Predictor,
private val satelliteRepo: Repository,
private val satelliteRepo: SatelliteRepo,
private val dataReporter: DataReporter
) : ViewModel(), OrientationSource.OrientationListener {
@@ -24,7 +24,7 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.ItemTransBinding
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.domain.model.Transmitter
import java.util.*
class TransmittersAdapter : RecyclerView.Adapter<TransmittersAdapter.TransHolder>() {
+7 -4
View File
@@ -17,7 +17,7 @@
android:id="@+id/entries_import_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginStart="18dp"
android:elevation="4dp"
android:text="@string/entries_update"
android:textSize="18sp"
@@ -53,13 +53,15 @@
<SearchView
android:id="@+id/entries_search_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_height="0dp"
android:layout_marginStart="2dp"
android:iconifiedByDefault="false"
android:queryHint="@string/entries_search_hint"
android:searchIcon="@null"
app:layout_constraintBottom_toBottomOf="@+id/entries_select_mode"
app:layout_constraintEnd_toStartOf="@+id/entries_select_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/entries_bar" />
app:layout_constraintTop_toBottomOf="@+id/entries_import_web" />
<ImageButton
android:id="@+id/entries_select_mode"
@@ -86,6 +88,7 @@
android:id="@+id/entries_recycler"
android:layout_width="0dp"
android:layout_height="0dp"
android:padding="2dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
+48 -11
View File
@@ -1,13 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.checkbox.MaterialCheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/entry_checkbox"
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/entry_card"
android:layout_width="match_parent"
android:layout_height="32dp"
android:background="@null"
android:button="@null"
android:drawableEnd="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="24dp"
android:paddingEnd="20dp"
android:text="@string/placeholder"
android:textColor="@color/greyLight"
android:textSize="16sp" />
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
app:cardElevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/entry_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/entry_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/placeholder"
android:textColor="@color/greyLight"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/entry_checkbox"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/entry_checkbox"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginEnd="8dp"
android:minWidth="0dp"
android:minHeight="0dp"
app:layout_constraintBottom_toBottomOf="@+id/entry_name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/entry_name"
app:layout_constraintTop_toTopOf="@+id/entry_name"
tools:ignore="TouchTargetSizeCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
+1 -1
View File
@@ -17,7 +17,7 @@
<string name="sources_error">Пожалуйста, проверьте URL</string>
<string name="entries_update">Обновить спутники:</string>
<string name="entries_search_hint">Имя / Номер</string>
<string name="entries_search_hint">Поиск по Имени / Id</string>
<string name="entries_update_error">Ошибка обновления спутников</string>
<string name="modes_title">Выберите модуляцию трансивера</string>
+1 -1
View File
@@ -20,7 +20,7 @@
<string name="sources_error">Please check the entered URL</string>
<string name="entries_update">TLE data update:</string>
<string name="entries_search_hint">Name / Id</string>
<string name="entries_search_hint">Search by Name / Id</string>
<string name="entries_update_error">Error importing satellite data</string>
<string name="modes_title">Choose transceiver mode</string>
@@ -17,12 +17,12 @@
*/
package com.rtbishop.look4sat.data
import com.rtbishop.look4sat.domain.Repository
import com.rtbishop.look4sat.model.SatEntry
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.predict4kotlin.TLE
import com.rtbishop.look4sat.domain.SatelliteRepo
import com.rtbishop.look4sat.domain.model.SatEntry
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite
import com.rtbishop.look4sat.domain.predict.TLE
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
@@ -35,7 +35,7 @@ class DataRepository(
private val localSource: LocalDataSource,
private val remoteSource: RemoteDataSource,
private val repoDispatcher: CoroutineDispatcher
) : Repository {
) : SatelliteRepo {
override fun getSatItems(): Flow<List<SatItem>> {
return localSource.getEntriesWithModes()
@@ -17,10 +17,10 @@
*/
package com.rtbishop.look4sat.data
import com.rtbishop.look4sat.model.SatEntry
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.model.SatEntry
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow
interface LocalDataSource {
@@ -17,7 +17,7 @@
*/
package com.rtbishop.look4sat.data
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.domain.model.Transmitter
import java.io.InputStream
interface RemoteDataSource {
@@ -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.common
package com.rtbishop.look4sat.domain
object Constants {
@@ -24,5 +24,4 @@ object Constants {
const val URL_AMSAT = "https://amsat.org/tle/current/nasabare.txt"
const val URL_PRISM_CLASSFD = "https://www.prismnet.com/~mmccants/tles/classfd.zip"
const val URL_PRISM_INTEL = "https://www.prismnet.com/~mmccants/tles/inttles.zip"
}
@@ -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.common
package com.rtbishop.look4sat.domain
sealed class DataState<out T> {
data class Success<out T>(val data: T) : DataState<T>()
@@ -17,14 +17,14 @@
*/
package com.rtbishop.look4sat.domain
import com.rtbishop.look4sat.predict4kotlin.GeoPos
import com.rtbishop.look4sat.domain.predict.GeoPos
import kotlin.math.round
object QthConverter {
fun qthToPosition(qthString: String): GeoPos? {
val trimmedQth = qthString.take(6)
if (!isValidQTH(trimmedQth)) return null
if (!isValidQth(trimmedQth)) return null
val lonFirst = (trimmedQth[0].uppercaseChar().code - 65) * 20
val latFirst = (trimmedQth[1].uppercaseChar().code - 65) * 10
val lonSecond = trimmedQth[2].toString().toInt() * 2
@@ -36,7 +36,7 @@ object QthConverter {
return GeoPos(latitude, longitude)
}
fun positionToQTH(lat: Double, lon: Double): String? {
fun positionToQth(lat: Double, lon: Double): String? {
if (!isValidPosition(lat, lon)) return null
val tempLon = if (lon > 180.0) lon - 360 else lon
val upper = "ABCDEFGHIJKLMNOPQRSTUVWX"
@@ -52,7 +52,7 @@ object QthConverter {
return "$lonFirst$latFirst$lonSecond$latSecond$lonThird$latThird"
}
private fun isValidQTH(qthString: String): Boolean {
private fun isValidQth(qthString: String): Boolean {
val qthPattern = "[a-xA-X][a-xA-X][0-9][0-9][a-xA-X][a-xA-X]".toRegex()
return qthString.matches(qthPattern)
}
@@ -17,13 +17,13 @@
*/
package com.rtbishop.look4sat.domain
import com.rtbishop.look4sat.model.SatItem
import com.rtbishop.look4sat.model.Transmitter
import com.rtbishop.look4sat.predict4kotlin.Satellite
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.domain.model.Transmitter
import com.rtbishop.look4sat.domain.predict.Satellite
import kotlinx.coroutines.flow.Flow
import java.io.InputStream
interface Repository {
interface SatelliteRepo {
fun getSatItems(): Flow<List<SatItem>>
@@ -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.model
package com.rtbishop.look4sat.domain.model
data class OMM(
val name: String,
@@ -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.model
package com.rtbishop.look4sat.domain.model
import com.rtbishop.look4sat.predict4kotlin.TLE
import com.rtbishop.look4sat.domain.predict.TLE
data class SatEntry(
val tle: 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.model
package com.rtbishop.look4sat.domain.model
data class SatItem(
val catNum: Int,
@@ -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.model
package com.rtbishop.look4sat.domain.model
data class Transmitter(
val uuid: String,
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import kotlin.math.*
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
data class GeoPos(val latitude: Double, val longitude: Double, val altitude: Double = 0.0)
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import kotlin.math.*
@@ -15,9 +15,8 @@
* 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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import com.rtbishop.look4sat.domain.*
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
data class SatPass(
val aosTime: Long,
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import kotlin.math.*
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import java.util.*
import java.util.concurrent.atomic.AtomicReference
@@ -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.predict4kotlin
package com.rtbishop.look4sat.domain.predict
import java.io.InputStream
import kotlin.math.pow
@@ -1,24 +0,0 @@
/*
* 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.usecases
import com.rtbishop.look4sat.domain.Repository
class GetSelectedSatellites(private val dataRepository: Repository) {
suspend operator fun invoke() = dataRepository.getSelectedSatellites()
}
@@ -15,8 +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.domain
package com.rtbishop.look4sat
import com.rtbishop.look4sat.domain.QthConverter
import org.junit.Test
class QthConverterTest {
@@ -29,29 +30,24 @@ class QthConverterTest {
assert(result?.latitude == 48.1458 && result.longitude == 11.6250)
result = QthConverter.qthToPosition("gf15vc")
assert(result?.latitude == -34.8958 && result.longitude == -56.2083)
result = QthConverter.qthToPosition("fm18LW")
assert(result?.latitude == 38.9375 && result.longitude == -77.0417)
}
@Test
fun `Given invalid QTH returns null`() {
var result = QthConverter.qthToPosition("ZZ00zz")
assert(result == null)
result = QthConverter.qthToPosition("JN58tz")
assert(result == null)
assert(QthConverter.qthToPosition("ZZ00zz") == null)
assert(QthConverter.qthToPosition("JN58") == null)
}
@Test
fun `Given valid POS returns correct QTH`() {
assert(QthConverter.positionToQTH(51.4878, -0.2146) == "IO91vl")
assert(QthConverter.positionToQTH(48.1466, 11.6083) == "JN58td")
assert(QthConverter.positionToQTH(-34.91, -56.2116) == "GF15vc")
assert(QthConverter.positionToQTH(38.92, -77.065) == "FM18lw")
assert(QthConverter.positionToQth(51.4878, -0.2146) == "IO91vl")
assert(QthConverter.positionToQth(48.1466, 11.6083) == "JN58td")
assert(QthConverter.positionToQth(-34.91, -56.2116) == "GF15vc")
}
@Test
fun `Given invalid POS returns null`() {
assert(QthConverter.positionToQTH(91.0542, -170.1142) == null)
assert(QthConverter.positionToQTH(89.0542, -240.1142) == null)
assert(QthConverter.positionToQth(91.0542, -170.1142) == null)
assert(QthConverter.positionToQth(89.0542, -240.1142) == null)
}
}
@@ -15,8 +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.predict4kotlin
package com.rtbishop.look4sat
import com.rtbishop.look4sat.domain.predict.TLE
import org.junit.Test
class TleParserTest {