Fix conversion display issues and remove annoying toast notifications

This commit is contained in:
cmclark00 2025-03-24 17:06:24 -04:00
parent 857331566e
commit f3bfa5650b
2 changed files with 49 additions and 33 deletions

View file

@ -17,6 +17,9 @@ class EntryFragment : Fragment() {
private val binding get() = _binding!!
private val viewModel: EntryViewModel by viewModels { EntryViewModelFactory(requireActivity().application) }
private lateinit var equivalentScoreAdapter: EquivalentScoreAdapter
// Flag to track if we already showed the requirements toast
private var hasShownRequirementsToast = false
override fun onCreateView(
inflater: LayoutInflater,
@ -35,8 +38,7 @@ class EntryFragment : Fragment() {
setupSubmitButton()
setupAutoAnalysis()
// Check if we should show conversions on startup
viewModel.checkConversionCriteria()
// Don't need to check on startup anymore - being handled by ViewModel
}
private fun setupGameVersionDropdown() {
@ -67,19 +69,7 @@ class EntryFragment : Fragment() {
// Observe if we should show conversions
viewModel.showConversion.observe(viewLifecycleOwner) { shouldShow ->
if (!shouldShow) {
// Hide analysis card if we don't meet criteria
binding.cardAnalysisResults.visibility = View.GONE
// Also show a message that not enough scores have been entered
if (viewModel.lastSubmittedGame.value != null) {
Toast.makeText(
context,
"Enter at least 3 scores across 2 different games to see conversions",
Toast.LENGTH_LONG
).show()
}
}
// No need to show toast here - we'll do it only after score submission
}
// Only setup equivalence UI when we have scores
@ -112,11 +102,13 @@ class EntryFragment : Fragment() {
// Observe last submitted score details
viewModel.lastSubmittedGame.observe(viewLifecycleOwner) { game ->
// Only continue if showConversion is true
if (viewModel.showConversion.value != true) return@observe
if (viewModel.showConversion.value != true) {
binding.cardAnalysisResults.visibility = View.GONE
return@observe
}
viewModel.lastSubmittedScore.value?.let { score ->
binding.textViewOriginalScore.text = "Your $game score of ${"%,d".format(score)} is equivalent to:"
binding.cardAnalysisResults.visibility = View.VISIBLE
// Get the list of games with scores
val playedGames = viewModel.gamesWithScores.value ?: listOf()
@ -124,6 +116,7 @@ class EntryFragment : Fragment() {
// Make sure we don't show the source game in the equivalent dropdown
val filteredGames = playedGames.filter { it != game }
if (filteredGames.isNotEmpty()) {
binding.cardAnalysisResults.visibility = View.VISIBLE
val filteredAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_dropdown_item_1line, filteredGames)
binding.autoCompleteEquivalentGame.setAdapter(filteredAdapter)
@ -133,11 +126,6 @@ class EntryFragment : Fragment() {
} else {
// If no other games to convert to, hide the card
binding.cardAnalysisResults.visibility = View.GONE
Toast.makeText(
context,
"Add scores for other games to see conversions",
Toast.LENGTH_LONG
).show()
}
}
}
@ -171,8 +159,15 @@ class EntryFragment : Fragment() {
)
clearInputs()
// Only scroll down if we're going to show conversions
if (viewModel.showConversion.value == true) {
// Check after submission if we should show requirements toast
if (viewModel.showConversion.value == false) {
Toast.makeText(
context,
"Enter at least 3 scores across 2 different games to see conversions",
Toast.LENGTH_LONG
).show()
} else {
// Only scroll down if we're going to show conversions
binding.root.post {
binding.root.fullScroll(View.FOCUS_DOWN)
}

View file

@ -1,6 +1,7 @@
package com.accidentalproductions.tetristats.ui.entry
import android.app.Application
import android.util.Log
import androidx.lifecycle.*
import com.accidentalproductions.tetristats.TetriStatsApplication
import com.accidentalproductions.tetristats.data.Score
@ -42,6 +43,17 @@ class EntryViewModel(application: Application) : AndroidViewModel(application) {
val lastSubmittedGame: LiveData<String> = _lastSubmittedGame
val lastSubmittedScore: LiveData<Int> = _lastSubmittedScore
val showConversion: LiveData<Boolean> = _showConversion
init {
// Set up observers to update conversion criteria whenever relevant data changes
gamesWithScores.observeForever {
checkConversionCriteria()
}
totalScoreCount.observeForever {
checkConversionCriteria()
}
}
fun getScoresForGame(gameVersion: String): LiveData<List<Score>> {
return scoreDao.getScoresForGame(gameVersion)
@ -55,13 +67,16 @@ class EntryViewModel(application: Application) : AndroidViewModel(application) {
* Check if we should show conversions based on score count and game count
*/
fun checkConversionCriteria() {
viewModelScope.launch {
val scoreCount = totalScoreCount.value ?: 0
val gameCount = gamesWithScores.value?.size ?: 0
// Only show conversions if there are at least 3 scores across at least 2 games
_showConversion.postValue(scoreCount >= 3 && gameCount >= 2)
}
val scoreCount = totalScoreCount.value ?: 0
val gameCount = gamesWithScores.value?.size ?: 0
// Only show conversions if there are at least 3 scores across at least 2 games
val shouldShow = scoreCount >= 3 && gameCount >= 2
// For debugging
Log.d("TetriStats", "Checking conversion criteria: scores=$scoreCount, games=$gameCount, shouldShow=$shouldShow")
_showConversion.postValue(shouldShow)
}
fun insertScore(
@ -85,8 +100,7 @@ class EntryViewModel(application: Application) : AndroidViewModel(application) {
_lastSubmittedGame.postValue(gameVersion)
_lastSubmittedScore.postValue(score)
// Check if we should show conversions
checkConversionCriteria()
// The criteria check will happen automatically through the observers in init
// Only generate equivalent scores if we meet the criteria
if (_showConversion.value == true) {
@ -141,6 +155,13 @@ class EntryViewModel(application: Application) : AndroidViewModel(application) {
}
}
}
override fun onCleared() {
super.onCleared()
// Remove our observers to prevent leaks
gamesWithScores.removeObserver { checkConversionCriteria() }
totalScoreCount.removeObserver { checkConversionCriteria() }
}
}
class EntryViewModelFactory(private val application: Application) : ViewModelProvider.Factory {