From f58f851151b93a0628ac05194ebbe9e06a7f157c Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Thu, 30 Dec 2021 11:51:27 +0000 Subject: [PATCH] Added PassesPrefsDialog.kt with extra, will cleanup later --- app/build.gradle | 3 + .../passesScreen/PassesFragment.kt | 30 +++++- .../passesScreen/PassesPrefsDialog.kt | 46 +++++++++ .../passesScreen/PassesViewModel.kt | 19 ++-- .../sourcesScreen/SourcesDialog.kt | 44 +++++++-- .../sourcesScreen/SourcesViewModel.kt | 15 --- app/src/main/res/drawable/ic_filter.xml | 9 ++ app/src/main/res/drawable/ic_sputnik_dark.xml | 14 +++ app/src/main/res/layout/dialog_passes.xml | 97 +++++++++++++++++++ app/src/main/res/layout/fragment_passes.xml | 9 +- .../main/res/layout/fragment_passes_new.xml | 64 ++++++++++++ app/src/main/res/navigation/nav_graph.xml | 38 ++------ app/src/main/res/values-ru/strings.xml | 9 ++ app/src/main/res/values/strings.xml | 11 +++ app/src/main/res/values/styles.xml | 7 ++ 15 files changed, 349 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt delete mode 100644 app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesViewModel.kt create mode 100644 app/src/main/res/drawable/ic_filter.xml create mode 100644 app/src/main/res/drawable/ic_sputnik_dark.xml create mode 100644 app/src/main/res/layout/dialog_passes.xml create mode 100644 app/src/main/res/layout/fragment_passes_new.xml diff --git a/app/build.gradle b/app/build.gradle index c1a44316..4f7e0490 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,9 @@ android { buildFeatures { viewBinding true } + hilt { + enableAggregatingTask true + } compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 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 3d972d1d..31e2b438 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 @@ -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>(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 diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt new file mode 100644 index 00000000..154d034e --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesPrefsDialog.kt @@ -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() } + } + } +} diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt index a369d9e2..d957b31c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/passesScreen/PassesViewModel.kt @@ -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) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt index 33052b4c..257ba849 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesDialog.kt @@ -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() } } - }) + } + } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesViewModel.kt deleted file mode 100644 index 93fe57f3..00000000 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/sourcesScreen/SourcesViewModel.kt +++ /dev/null @@ -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()) - } -} diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml new file mode 100644 index 00000000..0104d2e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_sputnik_dark.xml b/app/src/main/res/drawable/ic_sputnik_dark.xml new file mode 100644 index 00000000..39ce3290 --- /dev/null +++ b/app/src/main/res/drawable/ic_sputnik_dark.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_passes.xml b/app/src/main/res/layout/dialog_passes.xml new file mode 100644 index 00000000..5bbe7eee --- /dev/null +++ b/app/src/main/res/layout/dialog_passes.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + +