From e0f900366a704c592ed883f0775aab90c844465a Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Sat, 20 Mar 2021 17:00:29 +0000 Subject: [PATCH] Added PolarViewModel, removed SharedViewModel --- app/src/main/AndroidManifest.xml | 4 +-- .../look4sat/data/repository/PrefsRepo.kt | 2 +- .../{MainActivity.kt => Look4SatActivity.kt} | 10 ++++-- .../Look4SatApplication.kt} | 6 ++-- .../ui/entriesScreen/EntriesFragment.kt | 7 +++- .../ui/entriesScreen/EntriesViewModel.kt | 4 +-- .../look4sat/ui/mapScreen/MapFragment.kt | 7 ++-- .../look4sat/ui/mapScreen/MapViewModel.kt | 11 +++--- .../look4sat/ui/polarScreen/PolarFragment.kt | 7 ++-- .../PolarViewModel.kt} | 27 +++++---------- .../ui/sourcesDialog/SourcesAdapter.kt | 18 ++++------ .../ui/sourcesDialog/SourcesDialog.kt | 8 ++--- .../look4sat/ui/splashDialog/SplashDialog.kt | 2 +- app/src/main/res/layout/dialog_sources.xml | 34 +++++++++---------- app/src/main/res/layout/dialog_splash.xml | 4 +-- 15 files changed, 72 insertions(+), 79 deletions(-) rename app/src/main/java/com/rtbishop/look4sat/ui/{MainActivity.kt => Look4SatActivity.kt} (88%) rename app/src/main/java/com/rtbishop/look4sat/{Look4SatApp.kt => ui/Look4SatApplication.kt} (89%) rename app/src/main/java/com/rtbishop/look4sat/ui/{SharedViewModel.kt => polarScreen/PolarViewModel.kt} (67%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 653a6688..c2a1eaa3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,12 +7,12 @@ diff --git a/app/src/main/java/com/rtbishop/look4sat/data/repository/PrefsRepo.kt b/app/src/main/java/com/rtbishop/look4sat/data/repository/PrefsRepo.kt index 4a435723..9e5be0aa 100644 --- a/app/src/main/java/com/rtbishop/look4sat/data/repository/PrefsRepo.kt +++ b/app/src/main/java/com/rtbishop/look4sat/data/repository/PrefsRepo.kt @@ -135,7 +135,7 @@ class PrefsRepo @Inject constructor(val preferences: SharedPreferences, moshi: M preferences.edit { putString(keySources, sourcesJson) } } - private fun loadDefaultSources(): List { + fun loadDefaultSources(): List { return listOf( TleSource("https://celestrak.com/NORAD/elements/active.txt"), TleSource("https://amsat.org/tle/current/nasabare.txt"), diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt b/app/src/main/java/com/rtbishop/look4sat/ui/Look4SatActivity.kt similarity index 88% rename from app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/Look4SatActivity.kt index ac3c1529..9d42639c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/MainActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/Look4SatActivity.kt @@ -22,13 +22,13 @@ import androidx.appcompat.app.AppCompatActivity 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.data.repository.PrefsRepo +import com.rtbishop.look4sat.databinding.ActivityMainBinding import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class MainActivity : AppCompatActivity() { +class Look4SatActivity : AppCompatActivity() { @Inject lateinit var prefsRepo: PrefsRepo @@ -40,7 +40,11 @@ class MainActivity : AppCompatActivity() { setContentView(root) val navHost = supportFragmentManager.findFragmentById(R.id.nav_host) as NavHostFragment navBottom.setupWithNavController(navHost.navController) - if (prefsRepo.isFirstLaunch()) navHost.navController.navigate(R.id.nav_dialog_splash) + + if (prefsRepo.isFirstLaunch()) { + prefsRepo.setFirstLaunchDone() + navHost.navController.navigate(R.id.nav_dialog_splash) + } } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/Look4SatApp.kt b/app/src/main/java/com/rtbishop/look4sat/ui/Look4SatApplication.kt similarity index 89% rename from app/src/main/java/com/rtbishop/look4sat/Look4SatApp.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/Look4SatApplication.kt index ef73006b..6f11a9ff 100644 --- a/app/src/main/java/com/rtbishop/look4sat/Look4SatApp.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/Look4SatApplication.kt @@ -15,14 +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 +package com.rtbishop.look4sat.ui import android.app.Application +import com.rtbishop.look4sat.BuildConfig import dagger.hilt.android.HiltAndroidApp import timber.log.Timber @HiltAndroidApp -class Look4SatApp : Application() { +class Look4SatApplication : Application() { + override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt index e1779c67..47271812 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt @@ -100,7 +100,12 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), EntriesAdapter.Entr private fun observeSourcesResult() { getNavResult>(R.id.nav_entries, "sources") { result -> - viewModel.importSatDataFromSources(result.map { TleSource(it) }) + val sources = result.map { TleSource(it) } + if (sources.isNullOrEmpty()) { + viewModel.importSatDataFromSources() + } else { + viewModel.importSatDataFromSources(sources) + } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt index 98347132..31bcd977 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt @@ -59,13 +59,13 @@ class EntriesViewModel @Inject constructor( } } - fun importSatDataFromSources(sources: List = prefsRepo.loadTleSources()) { + fun importSatDataFromSources(sources: List = prefsRepo.loadDefaultSources()) { viewModelScope.launch { satDataState.emit(Result.InProgress) val updateMillis = measureTimeMillis { try { - satelliteRepo.importSatDataFromWeb(sources) prefsRepo.saveTleSources(sources) + satelliteRepo.importSatDataFromWeb(sources) } catch (exception: Exception) { satDataState.emit(Result.Error(exception)) } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapFragment.kt index cab2a7ff..a6c2e22e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapFragment.kt @@ -24,16 +24,14 @@ import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -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.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.data.repository.PrefsRepo +import com.rtbishop.look4sat.databinding.FragmentMapBinding import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.FlowPreview import org.osmdroid.config.Configuration @@ -56,7 +54,6 @@ class MapFragment : Fragment(R.layout.fragment_map) { lateinit var prefsRepo: PrefsRepo private lateinit var binding: FragmentMapBinding private val mapViewModel: MapViewModel by viewModels() - private val sharedViewModel: SharedViewModel by activityViewModels() private val minLat = MapView.getTileSystem().minLatitude private val maxLat = MapView.getTileSystem().maxLatitude @@ -85,7 +82,7 @@ class MapFragment : Fragment(R.layout.fragment_map) { private fun setupObservers() { mapViewModel.getGSP().observe(viewLifecycleOwner, { setupPosOverlay(it) }) - sharedViewModel.passes.observe(viewLifecycleOwner, { + mapViewModel.passes.observe(viewLifecycleOwner, { if (it is Result.Success && it.data.isNotEmpty()) { mapViewModel.setPasses(it.data) binding.fabPrev.setOnClickListener { mapViewModel.scrollSelection(true) } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapViewModel.kt index 8bd56e6d..07559a16 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/mapScreen/MapViewModel.kt @@ -19,14 +19,12 @@ package com.rtbishop.look4sat.ui.mapScreen import android.graphics.Color import android.graphics.Paint -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.* import com.github.amsacode.predict4java.Position import com.github.amsacode.predict4java.SatPos import com.rtbishop.look4sat.data.model.SatPass import com.rtbishop.look4sat.data.model.SelectedSat +import com.rtbishop.look4sat.data.repository.PassesRepo import com.rtbishop.look4sat.data.repository.PrefsRepo import com.rtbishop.look4sat.utility.QthConverter import dagger.hilt.android.lifecycle.HiltViewModel @@ -48,9 +46,10 @@ import kotlin.math.sqrt @HiltViewModel class MapViewModel @Inject constructor( private val prefsRepo: PrefsRepo, + passesRepo: PassesRepo, private val qthConverter: QthConverter ) : ViewModel() { - + private val dateNow = Date() private val trackPaint = Paint().apply { strokeWidth = 2f @@ -77,6 +76,8 @@ class MapViewModel @Inject constructor( private val _satMarkers = MutableLiveData>() fun getSatMarkers(): LiveData> = _satMarkers + val passes = passesRepo.passes.asLiveData() + fun setPasses(passesList: List) { filteredPasses = passesList.distinctBy { it.tle } selectedPass = filteredPasses[0] diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarFragment.kt index 05bcecbb..60ded8f2 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarFragment.kt @@ -25,16 +25,15 @@ import android.hardware.SensorManager import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels 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.model.Result import com.rtbishop.look4sat.data.model.SatPass -import com.rtbishop.look4sat.databinding.FragmentPolarBinding import com.rtbishop.look4sat.data.repository.PrefsRepo -import com.rtbishop.look4sat.ui.SharedViewModel +import com.rtbishop.look4sat.databinding.FragmentPolarBinding import com.rtbishop.look4sat.utility.RecyclerDivider import com.rtbishop.look4sat.utility.formatForTimer import dagger.hilt.android.AndroidEntryPoint @@ -54,7 +53,7 @@ class PolarFragment : Fragment(R.layout.fragment_polar), SensorEventListener { private lateinit var binding: FragmentPolarBinding private lateinit var satPass: SatPass private lateinit var sensorManager: SensorManager - private val viewModel: SharedViewModel by activityViewModels() + private val viewModel: PolarViewModel by viewModels() private var magneticDeclination = 0f private var polarView: PolarView? = null diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarViewModel.kt similarity index 67% rename from app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt rename to app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarViewModel.kt index c2f6bebd..f4dc4f86 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/SharedViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/polarScreen/PolarViewModel.kt @@ -15,37 +15,26 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.rtbishop.look4sat.ui +package com.rtbishop.look4sat.ui.polarScreen -import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.asLiveData import androidx.lifecycle.liveData -import com.rtbishop.look4sat.data.model.Result -import com.rtbishop.look4sat.data.model.SatPass +import com.rtbishop.look4sat.data.repository.PassesRepo import com.rtbishop.look4sat.data.repository.PrefsRepo import com.rtbishop.look4sat.data.repository.SatelliteRepo import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject -@FlowPreview @HiltViewModel -class SharedViewModel @Inject constructor( - prefsRepo: PrefsRepo, - private val satelliteRepo: SatelliteRepo, +class PolarViewModel @Inject constructor( + private val prefsRepo: PrefsRepo, + passesRepo: PassesRepo, + private val satelliteRepo: SatelliteRepo ) : ViewModel() { - private val _passes = MutableStateFlow>>(Result.InProgress) - val passes: LiveData>> = _passes.asLiveData() - - init { - if (prefsRepo.isFirstLaunch()) { - prefsRepo.setFirstLaunchDone() - } - } + val passes = passesRepo.passes.asLiveData() fun getAppTimer() = liveData { while (true) { @@ -55,4 +44,4 @@ class SharedViewModel @Inject constructor( } fun getTransmittersForSat(satId: Int) = satelliteRepo.getSatTransmitters(satId).asLiveData() -} +} \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesAdapter.kt index 75fca2a8..84895e68 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesAdapter.kt @@ -24,25 +24,21 @@ import androidx.recyclerview.widget.RecyclerView import com.rtbishop.look4sat.data.model.TleSource import com.rtbishop.look4sat.databinding.ItemTleSourceBinding -class SourcesAdapter : RecyclerView.Adapter() { - - private val sources = mutableListOf() - +class SourcesAdapter(private val sources: MutableList = mutableListOf()) : + RecyclerView.Adapter() { + fun getSources(): List { - return sources.filter { it.url != String() && it.url != " " && it.url.contains("https://") } + return sources.filter { it.url.contains("https://") } } - + fun setSources(list: List) { sources.clear() sources.addAll(list) } fun addSource() { - val emptySource = TleSource() - if (!sources.contains(emptySource)) { - sources.add(emptySource) - notifyItemInserted(itemCount - 1) - } + sources.add(TleSource()) + notifyItemInserted(itemCount - 1) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TleSourceHolder { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt index 8120efbc..c9eb6bf7 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/sourcesDialog/SourcesDialog.kt @@ -49,18 +49,18 @@ class SourcesDialog : AppCompatDialogFragment() { WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT ) - tleSourcesRecycler.apply { + sourcesRecycler.apply { adapter = sourcesAdapter layoutManager = LinearLayoutManager(requireContext()) } - tleSourceBtnAdd.setOnClickListener { + sourceBtnAdd.setOnClickListener { sourcesAdapter.addSource() } - tleSourcesBtnPos.setOnClickListener { + sourcesBtnPos.setOnClickListener { setNavResult("sources", sourcesAdapter.getSources().map { it.url }) dismiss() } - tleSourcesBtnNeg.setOnClickListener { dismiss() } + sourcesBtnNeg.setOnClickListener { dismiss() } } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/splashDialog/SplashDialog.kt b/app/src/main/java/com/rtbishop/look4sat/ui/splashDialog/SplashDialog.kt index 49df826d..526b9fa9 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/splashDialog/SplashDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/splashDialog/SplashDialog.kt @@ -39,7 +39,7 @@ class SplashDialog : AppCompatDialogFragment() { WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT ) - splashButton.setOnClickListener { dismiss() } + splashOkButton.setOnClickListener { dismiss() } } } } diff --git a/app/src/main/res/layout/dialog_sources.xml b/app/src/main/res/layout/dialog_sources.xml index c1af22ca..71d3e729 100644 --- a/app/src/main/res/layout/dialog_sources.xml +++ b/app/src/main/res/layout/dialog_sources.xml @@ -8,41 +8,41 @@ android:padding="4dp"> + app:layout_constraintStart_toStartOf="@+id/sourcesRecycler" + app:layout_constraintTop_toBottomOf="@+id/sourcesTitle" /> + app:layout_constraintEnd_toEndOf="@+id/sourcesRecycler" + app:layout_constraintTop_toTopOf="@+id/sourcesTitle" /> + app:layout_constraintTop_toBottomOf="@+id/sourcesWarning"> + app:layout_constraintStart_toStartOf="@+id/sourcesRecycler" /> + app:layout_constraintEnd_toEndOf="@+id/sourcesRecycler" + app:layout_constraintTop_toBottomOf="@+id/sourcesRecycler" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_splash.xml b/app/src/main/res/layout/dialog_splash.xml index a99d8797..8b189ddf 100644 --- a/app/src/main/res/layout/dialog_splash.xml +++ b/app/src/main/res/layout/dialog_splash.xml @@ -31,7 +31,7 @@ android:background="@drawable/rounded_corner" android:contentDescription="@string/placeholder" android:padding="8dp" - app:layout_constraintBottom_toTopOf="@+id/splashButton" + app:layout_constraintBottom_toTopOf="@+id/splashOkButton" app:layout_constraintDimensionRatio="w,1:1" app:layout_constraintEnd_toStartOf="@+id/splashTleMsg" app:layout_constraintHorizontal_bias="0.5" @@ -69,7 +69,7 @@ app:layout_constraintTop_toTopOf="@+id/splashTleIcon" />