Added PassesPrefsDialog.kt with extra, will cleanup later

This commit is contained in:
Arty Bishop committed 2022-01-09 17:59:24 +00:00
1 parent be26b3e1dc
commit f58f851151
15 files changed
+349 -66

No files matched your search

@@ -29,9 +29,10 @@ 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.domain.predict.SatPass
import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.presentation.ItemDivider
import com.rtbishop.look4sat.presentation.getNavResult
import com.rtbishop.look4sat.presentation.navigateSafe
import com.rtbishop.look4sat.presentation.toTimerString
import dagger.hilt.android.AndroidEntryPoint
@@ -66,15 +67,37 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC
layoutManager = LinearLayoutManager(context)
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
addItemDecoration(ItemDivider(R.drawable.rec_divider_dark))
// addOnScrollListener(object : RecyclerView.OnScrollListener() {
// override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
// if (dy > 0 && passesFab.visibility == View.VISIBLE) passesFab.hide()
// else if (dy < 0 && passesFab.visibility != View.VISIBLE) passesFab.show()
// }
// })
}
passesRefresh.setOnClickListener { passesViewModel.forceCalculation() }
passesRefresh.setOnClickListener { findNavController().navigate(R.id.nav_pass_prefs) }
// passesSwipe.apply {
// setColorSchemeResources(R.color.greySurface)
// setProgressBackgroundColorSchemeResource(R.color.themeLight)
// setOnRefreshListener { passesViewModel.forceCalculation() }
// }
}
// val appBarConfiguration = AppBarConfiguration(setOf(R.id.nav_passes))
// binding.passesToolbar.setupWithNavController(findNavController(), appBarConfiguration)
// binding.passesToolbar.navigationIcon =
// ResourcesCompat.getDrawable(resources, R.drawable.ic_add, requireActivity().theme)
// binding.passesToolbar.inflateMenu(R.menu.passes_menu)
// binding.passesFab.setOnClickListener {
// findNavController().navigate(R.id.nav_entries)
// }
passesViewModel.passes.observe(viewLifecycleOwner, { passesResult ->
handleNewPasses(passesResult, passesAdapter, binding)
})
passesViewModel.isFirstLaunchDone.observe(viewLifecycleOwner, { setupDone ->
if (!setupDone) locPermReq.launch(arrayOf(locPermFine, locPermCoarse))
})
getNavResult<Pair<Int, Double>>(R.id.nav_passes, "prefs") { prefs ->
passesViewModel.forceCalculation(prefs.first, prefs.second)
}
}
private fun handleNewPasses(
@@ -86,6 +109,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC
is DataState.Success -> {
passesAdapter.submitList(dataState.data)
binding.apply {
// passesSwipe.isRefreshing = false
passesError.visibility = View.INVISIBLE
passesProgress.visibility = View.INVISIBLE
passesRecycler.visibility = View.VISIBLE
@@ -94,6 +118,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC
}
is DataState.Loading -> {
binding.apply {
// passesSwipe.isRefreshing = true
passesTimer.text = 0L.toTimerString()
passesError.visibility = View.INVISIBLE
passesRecycler.visibility = View.INVISIBLE
@@ -102,6 +127,7 @@ class PassesFragment : Fragment(R.layout.fragment_passes), PassesAdapter.PassesC
}
else -> {
binding.apply {
// passesSwipe.isRefreshing = false
passesTimer.text = 0L.toTimerString()
passesProgress.visibility = View.INVISIBLE
passesRecycler.visibility = View.INVISIBLE
@@ -0,0 +1,46 @@
package com.rtbishop.look4sat.presentation.passesScreen
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.DialogPassesBinding
import com.rtbishop.look4sat.framework.PreferencesSource
import com.rtbishop.look4sat.presentation.setNavResult
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class PassesPrefsDialog : AppCompatDialogFragment() {
@Inject
lateinit var preferences: PreferencesSource
override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? {
return inflater.inflate(R.layout.dialog_passes, group, false)
}
override fun onViewCreated(view: View, state: Bundle?) {
super.onViewCreated(view, state)
DialogPassesBinding.bind(view).apply {
dialog?.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
hoursAheadEdit.setText(preferences.getHoursAhead().toString())
minElevEdit.setText(preferences.getMinElevation().toString())
passPrefBtnPos.setOnClickListener {
val hoursAheadText = hoursAheadEdit.text.toString()
val hoursAhead = if (hoursAheadText.isNotEmpty()) hoursAheadText.toInt() else 8
val minElevText = minElevEdit.text.toString()
val minElev = if (minElevText.isNotEmpty()) minElevText.toDouble() else 16.0
setNavResult("prefs", Pair(hoursAhead, minElev))
dismiss()
}
passPrefBtnNeg.setOnClickListener { dismiss() }
}
}
}
@@ -21,10 +21,10 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.rtbishop.look4sat.domain.DataRepository
import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.predict.Predictor
import com.rtbishop.look4sat.domain.predict.SatPass
import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.DataRepository
import com.rtbishop.look4sat.framework.PreferencesSource
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.*
@@ -82,16 +82,17 @@ class PassesViewModel @Inject constructor(
}
}
fun forceCalculation() {
fun forceCalculation(
hoursAhead: Int = preferences.getHoursAhead(),
minElevation: Double = preferences.getMinElevation(),
timeRef: Long = System.currentTimeMillis()
) {
viewModelScope.launch {
_passes.postValue(DataState.Loading)
passesProcessing?.cancelAndJoin()
val timeNow = System.currentTimeMillis()
val satellites = dataRepository.getSelectedSatellites()
val stationPos = preferences.loadStationPosition()
val hoursAhead = preferences.getHoursAhead()
val minElev = preferences.getMinElevation()
predictor.forceCalculation(satellites, stationPos, timeNow, hoursAhead, minElev)
predictor.forceCalculation(satellites, stationPos, timeRef, hoursAhead, minElevation)
}
}
@@ -114,7 +115,9 @@ class PassesViewModel @Inject constructor(
}
}
currentPasses = currentPasses.filter { it.progress < 100 }
_passes.postValue(DataState.Success(currentPasses.map { it.copy() }))
val passesCopy = currentPasses.map { it.copy() }
if (passesCopy.isEmpty()) _passes.postValue(DataState.Empty)
else _passes.postValue(DataState.Success(passesCopy))
delay(1000)
}
}
@@ -23,18 +23,22 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.databinding.DialogSourcesBinding
import com.rtbishop.look4sat.domain.DataRepository
import com.rtbishop.look4sat.framework.model.Source
import com.rtbishop.look4sat.presentation.setNavResult
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
class SourcesDialog : AppCompatDialogFragment() {
private val viewModel: SourcesViewModel by viewModels()
@Inject
lateinit var dataRepository: DataRepository
override fun onCreateView(inflater: LayoutInflater, group: ViewGroup?, state: Bundle?): View? {
return inflater.inflate(R.layout.dialog_sources, group, false)
@@ -42,26 +46,50 @@ class SourcesDialog : AppCompatDialogFragment() {
override fun onViewCreated(view: View, state: Bundle?) {
super.onViewCreated(view, state)
viewModel.sources.observe(viewLifecycleOwner, { sources ->
val adapter = SourcesAdapter().apply { setSources(sources.map { Source(it) }) }
// liveData { emit(dataRepository.getWebSources()) }.observe(viewLifecycleOwner, { sources ->
// val sourcesAdapter = SourcesAdapter().apply { setSources(sources.map { Source(it) }) }
// DialogSourcesBinding.bind(view).apply {
// dialog?.window?.setLayout(
// WindowManager.LayoutParams.MATCH_PARENT,
// WindowManager.LayoutParams.WRAP_CONTENT
// )
// sourcesRecycler.apply {
// adapter = sourcesAdapter
// layoutManager = LinearLayoutManager(requireContext())
// }
// sourcesBtnAdd.setOnClickListener {
// sourcesAdapter.addSource()
// }
// sourcesBtnPos.setOnClickListener {
// setNavResult("sources", sourcesAdapter.getSources().map { it.sourceUrl })
// dismiss()
// }
// sourcesBtnNeg.setOnClickListener { dismiss() }
// }
// })
lifecycleScope.launch {
val sources = dataRepository.getWebSources()
val sourcesAdapter = SourcesAdapter()
DialogSourcesBinding.bind(view).apply {
dialog?.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
sourcesRecycler.apply {
this.adapter = adapter
sourcesAdapter.apply { setSources(sources.map { Source(it) }) }
adapter = sourcesAdapter
layoutManager = LinearLayoutManager(requireContext())
}
sourcesBtnAdd.setOnClickListener {
adapter.addSource()
sourcesAdapter.addSource()
}
sourcesBtnPos.setOnClickListener {
setNavResult("sources", adapter.getSources().map { it.sourceUrl })
setNavResult("sources", sourcesAdapter.getSources().map { it.sourceUrl })
dismiss()
}
sourcesBtnNeg.setOnClickListener { dismiss() }
}
})
}
}
}
@@ -1,15 +0,0 @@
package com.rtbishop.look4sat.presentation.sourcesScreen
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
import com.rtbishop.look4sat.domain.DataRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class SourcesViewModel @Inject constructor(dataRepository: DataRepository) : ViewModel() {
val sources = liveData {
emit(dataRepository.getWebSources())
}
}