From 968edfbb67fb0e22559f6954b288ac01605fd8a3 Mon Sep 17 00:00:00 2001 From: Fabian Zobrist Date: Thu, 29 Dec 2022 10:08:04 +0100 Subject: [PATCH] Optimize query. Update teamname on change. --- .../me/zobrist/tichucounter/data/DaoBase.kt | 6 ++- .../me/zobrist/tichucounter/data/GameDao.kt | 4 +- .../me/zobrist/tichucounter/data/RoundDao.kt | 15 ++++-- .../fragments/HistoryListViewModel.kt | 50 +++++-------------- .../tichucounter/fragments/TeamNames.kt | 21 ++++---- .../fragments/TeamScoresViewModel.kt | 23 +++------ 6 files changed, 46 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/me/zobrist/tichucounter/data/DaoBase.kt b/app/src/main/java/me/zobrist/tichucounter/data/DaoBase.kt index 563f3d2..6595ab3 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/DaoBase.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/DaoBase.kt @@ -1,7 +1,9 @@ package me.zobrist.tichucounter.data -import androidx.room.* -import kotlinx.coroutines.flow.Flow +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Update @Dao interface DaoBase { diff --git a/app/src/main/java/me/zobrist/tichucounter/data/GameDao.kt b/app/src/main/java/me/zobrist/tichucounter/data/GameDao.kt index d4bf597..66e19e7 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/GameDao.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/GameDao.kt @@ -5,13 +5,13 @@ import kotlinx.coroutines.flow.Flow @Dao -interface GameDao: DaoBase { +interface GameDao : DaoBase { @Query("SELECT * FROM game") fun getAll(): Flow> @Query("SELECT * FROM game WHERE uid is :gameId") - fun getGameById(gameId: Long): Game + fun getGameById(gameId: Long): Flow @Query("SELECT * FROM game WHERE active is 1") fun getActive(): Game diff --git a/app/src/main/java/me/zobrist/tichucounter/data/RoundDao.kt b/app/src/main/java/me/zobrist/tichucounter/data/RoundDao.kt index aface1a..407f8ac 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/RoundDao.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/RoundDao.kt @@ -1,13 +1,10 @@ package me.zobrist.tichucounter.data -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.Query +import androidx.room.* import kotlinx.coroutines.flow.Flow @Dao -interface RoundDao: DaoBase { +interface RoundDao : DaoBase { @Query("SELECT * FROM round") fun getAll(): Flow> @@ -15,6 +12,14 @@ interface RoundDao: DaoBase { @Query("SELECT * FROM round WHERE gameId is :gameId") fun getAllForGame(gameId: Long?): List + @Query( + "SELECT gameId, scoreA, scoreB, round.uid " + + "FROM round " + + "LEFT JOIN game ON game.uid = round.gameId " + + "WHERE game.active == 1" + ) + fun getForActiveGame(): Flow> + @Insert fun insertAll(vararg rounds: Round) diff --git a/app/src/main/java/me/zobrist/tichucounter/fragments/HistoryListViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/fragments/HistoryListViewModel.kt index 2a0c77d..2294e86 100644 --- a/app/src/main/java/me/zobrist/tichucounter/fragments/HistoryListViewModel.kt +++ b/app/src/main/java/me/zobrist/tichucounter/fragments/HistoryListViewModel.kt @@ -6,34 +6,22 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import me.zobrist.tichucounter.data.GameDao import me.zobrist.tichucounter.data.Round import me.zobrist.tichucounter.data.RoundDao import me.zobrist.tichucounter.framework.SingleLiveEvent -import me.zobrist.tichucounter.repository.GameRepository import javax.inject.Inject @HiltViewModel -class HistoryListViewModel @Inject constructor( - private val roundDao: RoundDao, - private val gameDao: GameDao, - private val gameRepository: GameRepository -) : ViewModel() { +class HistoryListViewModel @Inject constructor(private val roundDao: RoundDao) : ViewModel() { + private val _historyA: MutableLiveData = MutableLiveData() private val _historyB: MutableLiveData = MutableLiveData() private val _scrollDown: SingleLiveEvent = SingleLiveEvent() - init { viewModelScope.launch { - roundDao.getAll().collect { - update() - } - } - - viewModelScope.launch { - gameDao.getAll().collect { - update() + roundDao.getForActiveGame().collect() { scores -> + update(scores) } } } @@ -53,31 +41,19 @@ class HistoryListViewModel @Inject constructor( return _scrollDown } - private suspend fun update() { - val scores = gameRepository.getActiveRoundHistory() - if (scores != null) { - getHistoryA(scores) - getHistoryB(scores) + private fun update(scores: List) { + var historyA = String() + var historyB = String() + + scores.forEach { + historyA += it.scoreA.toString() + "\n" + historyB += it.scoreB.toString() + "\n" } + _historyA.value = historyA + _historyB.value = historyB scrollDown() } - private fun getHistoryA(scores: List) { - var tempHistory = String() - scores.forEach { - tempHistory += it.scoreA.toString() + "\n" - } - _historyA.value = tempHistory - } - - private fun getHistoryB(scores: List) { - var tempHistory = String() - scores.forEach { - tempHistory += it.scoreB.toString() + "\n" - } - _historyB.value = tempHistory - } - private fun scrollDown() { _scrollDown.value = true } diff --git a/app/src/main/java/me/zobrist/tichucounter/fragments/TeamNames.kt b/app/src/main/java/me/zobrist/tichucounter/fragments/TeamNames.kt index e2a0b32..023e755 100644 --- a/app/src/main/java/me/zobrist/tichucounter/fragments/TeamNames.kt +++ b/app/src/main/java/me/zobrist/tichucounter/fragments/TeamNames.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.activityViewModels import me.zobrist.tichucounter.databinding.FragmentTeamNamesBinding @@ -16,24 +17,24 @@ class TeamNames : FragmentBase() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - binding.nameTeamA.setOnFocusChangeListener { _, focus -> - if (!focus) { - viewModel.setNameA(binding.nameTeamA.text.toString()) - } + binding.nameTeamA.doAfterTextChanged { + viewModel.setNameA(binding.nameTeamA.text.toString()) } - binding.nameTeamB.setOnFocusChangeListener { _, focus -> - if (!focus) { - viewModel.setNameB(binding.nameTeamB.text.toString()) - } + binding.nameTeamB.doAfterTextChanged { + viewModel.setNameB(binding.nameTeamB.text.toString()) } viewModel.nameA.observe(viewLifecycleOwner) { value -> - binding.nameTeamA.setText(value) + if (value != binding.nameTeamA.text.toString()) { + binding.nameTeamA.setText(value) + } } viewModel.nameB.observe(viewLifecycleOwner) { value -> - binding.nameTeamB.setText(value) + if (value != binding.nameTeamB.text.toString()) { + binding.nameTeamB.setText(value) + } } } diff --git a/app/src/main/java/me/zobrist/tichucounter/fragments/TeamScoresViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/fragments/TeamScoresViewModel.kt index 7d03f46..93ea77c 100644 --- a/app/src/main/java/me/zobrist/tichucounter/fragments/TeamScoresViewModel.kt +++ b/app/src/main/java/me/zobrist/tichucounter/fragments/TeamScoresViewModel.kt @@ -6,36 +6,25 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch -import me.zobrist.tichucounter.data.GameDao +import me.zobrist.tichucounter.data.Round import me.zobrist.tichucounter.data.RoundDao -import me.zobrist.tichucounter.repository.GameRepository import javax.inject.Inject @HiltViewModel -class TeamScoresViewModel @Inject constructor( - private val roundDao: RoundDao, - private val gameDao: GameDao, - private val gameRepository: GameRepository -) : ViewModel() { +class TeamScoresViewModel @Inject constructor(private val roundDao: RoundDao) : ViewModel() { + private var _scoreA: MutableLiveData = MutableLiveData() private var _scoreB: MutableLiveData = MutableLiveData() init { viewModelScope.launch { - roundDao.getAll().collect { - update() - } - } - - viewModelScope.launch { - gameDao.getAll().collect { - update() + roundDao.getForActiveGame().collect() { scores -> + update(scores) } } } - private suspend fun update() { - val scores = gameRepository.getActiveRoundHistory() + private fun update(scores: List) { var scoreA = 0 var scoreB = 0