diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36a69809..25a7bb20 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:label="@string/app_name" android:theme="@style/Theme.Look4Sat.Main"> @@ -24,4 +24,4 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt similarity index 89% rename from app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt rename to app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt index 8d4ed819..fac74185 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/Look4SatActivity.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainActivity.kt @@ -20,13 +20,16 @@ package com.rtbishop.look4sat.presentation import android.annotation.SuppressLint import android.content.pm.ActivityInfo import android.os.Bundle +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.rtbishop.look4sat.databinding.ActivityMainBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class Look4SatActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity() { + + private val mainViewModel: MainViewModel by viewModels() @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { @@ -34,5 +37,6 @@ class Look4SatActivity : AppCompatActivity() { super.onCreate(savedInstanceState) installSplashScreen() setContentView(ActivityMainBinding.inflate(layoutInflater).root) + mainViewModel.calculatePasses() } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt new file mode 100644 index 00000000..148065f8 --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/MainViewModel.kt @@ -0,0 +1,30 @@ +package com.rtbishop.look4sat.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.rtbishop.look4sat.domain.DataRepository +import com.rtbishop.look4sat.domain.predict.Predictor +import com.rtbishop.look4sat.framework.SettingsProvider +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MainViewModel @Inject constructor( + private val predictor: Predictor, + private val preferences: SettingsProvider, + private val dataRepository: DataRepository +) : ViewModel() { + + fun calculatePasses( + hoursAhead: Int = preferences.getHoursAhead(), + minElevation: Double = preferences.getMinElevation(), + timeRef: Long = System.currentTimeMillis() + ) { + viewModelScope.launch { + val satellites = dataRepository.getSelectedSatellites() + val stationPos = preferences.loadStationPosition() + predictor.forceCalculation(satellites, stationPos, timeRef, hoursAhead, minElevation) + } + } +} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt index 7a6f199c..e24706b5 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/entriesScreen/EntriesFragment.kt @@ -24,8 +24,8 @@ import androidx.core.widget.doOnTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.SimpleItemAnimator import com.google.android.material.snackbar.Snackbar import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentEntriesBinding @@ -44,14 +44,16 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { } private fun setupComponents(view: View) { - val entriesAdapter = EntriesAdapter(viewModel) + val context = requireContext() + val adapter = EntriesAdapter(viewModel) + val layoutManager = GridLayoutManager(context, 2) + val itemDecoration = DividerItemDecoration(context, layoutManager.orientation) val binding = FragmentEntriesBinding.bind(view).apply { entriesRecycler.apply { setHasFixedSize(true) - adapter = entriesAdapter - layoutManager = GridLayoutManager(requireContext(), 2) - (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false -// addItemDecoration(ItemDivider(R.drawable.divider_dark)) + this.adapter = adapter + this.layoutManager = layoutManager + addItemDecoration(itemDecoration) } entriesBack.setOnClickListener { findNavController().navigateUp() } entriesSearch.doOnTextChanged { text, _, _, _ -> viewModel.setQuery(text.toString()) } @@ -59,7 +61,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries) { entriesSelectAll.setOnClickListener { viewModel.selectCurrentItems() } } viewModel.satData.observe(viewLifecycleOwner, { satData -> - handleSatData(satData, binding, entriesAdapter) + handleSatData(satData, binding, adapter) }) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt index 2a50afad..ca69b4a2 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesFragment.kt @@ -23,9 +23,9 @@ import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.recyclerview.widget.SimpleItemAnimator import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentPassesBinding import com.rtbishop.look4sat.domain.model.DataState @@ -47,14 +47,16 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC } private fun setupComponents(view: View) { - val passesAdapter = PassesAdapter(passesViewModel.shouldUseUTC(), this) + val context = requireContext() + val adapter = PassesAdapter(passesViewModel.shouldUseUTC(), this) + val layoutManager = LinearLayoutManager(context) + val itemDecoration = DividerItemDecoration(context, layoutManager.orientation) val binding = FragmentPassesBinding.bind(view).apply { passesList.apply { setHasFixedSize(true) - adapter = passesAdapter - isVerticalScrollBarEnabled = false - layoutManager = LinearLayoutManager(context) - (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + this.adapter = adapter + this.layoutManager = layoutManager + addItemDecoration(itemDecoration) addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { if (dy > 0 && passesFab.visibility == View.VISIBLE) passesFab.hide() @@ -72,7 +74,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC passesFab.setOnClickListener { findNavController().navigate(R.id.nav_satellites) } } passesViewModel.passes.observe(viewLifecycleOwner, { passesResult -> - handleNewPasses(passesResult, passesAdapter, binding) + handleNewPasses(passesResult, adapter, binding) }) getNavResult>(R.id.nav_passes, "prefs") { prefs -> passesViewModel.forceCalculation(prefs.first, prefs.second) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt index c4c650bc..a7b6f21b 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/radarScreen/RadarFragment.kt @@ -23,8 +23,8 @@ import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.SimpleItemAnimator import com.rtbishop.look4sat.R import com.rtbishop.look4sat.databinding.FragmentRadarBinding import com.rtbishop.look4sat.domain.predict.SatPass @@ -45,30 +45,25 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setupComponents(view) + } + + private fun setupComponents(view: View) { + val context = requireContext() + val adapter = TransmittersAdapter() + val layoutManager = LinearLayoutManager(context) + val itemDecoration = DividerItemDecoration(context, layoutManager.orientation) FragmentRadarBinding.bind(view).apply { - val transAdapter = TransmittersAdapter() radarRecycler.apply { setHasFixedSize(true) - adapter = transAdapter - isVerticalScrollBarEnabled = false - layoutManager = LinearLayoutManager(context) - (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false -// addItemDecoration(ItemDivider(R.drawable.divider_dark)) + this.adapter = adapter + this.layoutManager = LinearLayoutManager(context) + addItemDecoration(itemDecoration) } - setupObservers(transAdapter, this) + setupObservers(adapter, this) } } - override fun onResume() { - super.onResume() - viewModel.enableSensor() - } - - override fun onPause() { - super.onPause() - viewModel.disableSensor() - } - private fun setupObservers( transmittersAdapter: TransmittersAdapter, binding: FragmentRadarBinding @@ -80,7 +75,7 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { setShowAim(preferences.getUseCompass()) setScanning(preferences.getShowSweep()) } - binding.radarFrame.addView(radarView) + binding.radarCard.addView(radarView) viewModel.radarData.observe(viewLifecycleOwner, { passData -> radarView?.setPosition(passData.satPos) radarView?.setPositions(passData.satTrack) @@ -139,4 +134,14 @@ class RadarFragment : Fragment(R.layout.fragment_radar) { binding.radarTimer.text = 0L.toTimerString() } } + + override fun onResume() { + super.onResume() + viewModel.enableSensor() + } + + override fun onPause() { + super.onPause() + viewModel.disableSensor() + } } diff --git a/app/src/main/res/drawable/item_divider.xml b/app/src/main/res/drawable/item_divider.xml new file mode 100644 index 00000000..2b4c712d --- /dev/null +++ b/app/src/main/res/drawable/item_divider.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_corners.xml b/app/src/main/res/drawable/rounded_corners.xml index 1394ce5a..ebcb0d84 100644 --- a/app/src/main/res/drawable/rounded_corners.xml +++ b/app/src/main/res/drawable/rounded_corners.xml @@ -1,8 +1,8 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/card_prefs_about.xml b/app/src/main/res/layout/card_prefs_about.xml index 49b28fb8..281a79d2 100644 --- a/app/src/main/res/layout/card_prefs_about.xml +++ b/app/src/main/res/layout/card_prefs_about.xml @@ -1,95 +1,102 @@ - - + - + - + - + -