diff --git a/app/src/main/java/me/zobrist/tichucounter/data/GameAndScore.kt b/app/src/main/java/me/zobrist/tichucounter/data/GameAndScore.kt index d2d3bd9..7969edf 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/GameAndScore.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/GameAndScore.kt @@ -11,7 +11,7 @@ data class GameAndScore( override val created: Date, override var modified: Date, override var gameId: Long, - override var scoreA: Int?, - override var scoreB: Int?, + override var scoreA: Int, + override var scoreB: Int, ) : IGame, IRound { } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/data/IRound.kt b/app/src/main/java/me/zobrist/tichucounter/data/IRound.kt index e05a33d..6b62039 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/IRound.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/IRound.kt @@ -2,6 +2,6 @@ package me.zobrist.tichucounter.data interface IRound { var gameId: Long - var scoreA: Int? - var scoreB: Int? + var scoreA: Int + var scoreB: Int } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/data/Round.kt b/app/src/main/java/me/zobrist/tichucounter/data/Round.kt index de27554..828fbf5 100644 --- a/app/src/main/java/me/zobrist/tichucounter/data/Round.kt +++ b/app/src/main/java/me/zobrist/tichucounter/data/Round.kt @@ -6,7 +6,7 @@ import androidx.room.PrimaryKey @Entity data class Round( override var gameId: Long, - override var scoreA: Int?, - override var scoreB: Int?, + override var scoreA: Int, + override var scoreB: Int, @PrimaryKey(autoGenerate = true) override val uid: Long? = null ) : IRound, IEntity \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterFragment.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterFragment.kt index 675dc6e..cb8719a 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterFragment.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/CounterFragment.kt @@ -5,13 +5,11 @@ import android.view.* import androidx.appcompat.app.AlertDialog import androidx.core.view.MenuHost import androidx.core.view.MenuProvider -import androidx.fragment.app.activityViewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import me.zobrist.tichucounter.R -import me.zobrist.tichucounter.data.Round import me.zobrist.tichucounter.databinding.FragmentCounterBinding import me.zobrist.tichucounter.repository.GameRepository import me.zobrist.tichucounter.ui.FragmentBase @@ -26,12 +24,6 @@ class CounterFragment : FragmentBase(), MenuProvider { override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentCounterBinding get() = FragmentCounterBinding::inflate - private var currentRound: Round = Round(0, 0, null, null) - - private var ignoreNextUpdate: Boolean = false - - private val keyboardViewModel: KeyboardViewModel by activityViewModels() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundList.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundList.kt index 9951064..47f7671 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundList.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundList.kt @@ -4,32 +4,103 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import dagger.hilt.android.AndroidEntryPoint -import me.zobrist.tichucounter.databinding.FragmentRoundListBinding -import me.zobrist.tichucounter.ui.FragmentBase +import kotlinx.coroutines.launch +import me.zobrist.tichucounter.data.Round @AndroidEntryPoint -class RoundList : FragmentBase() { - - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentRoundListBinding - get() = FragmentRoundListBinding::inflate +class RoundList : Fragment() { private val viewModel: RoundListViewModel by activityViewModels() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { - viewModel.historyA.observe(viewLifecycleOwner) { text -> - binding.historyA.text = text - } - - viewModel.historyB.observe(viewLifecycleOwner) { text -> - binding.historyB.text = text - } - - viewModel.scrollDown.observe(viewLifecycleOwner) { - binding.scrollViewHistory.smoothScrollTo(0, binding.scrollViewHistory.height) + return ComposeView(requireContext()).apply { + // Dispose of the Composition when the view's LifecycleOwner + // is destroyed + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + MaterialTheme { + RoundListView(viewModel) + } + } } } + + @Preview + @Composable + fun RoundListView(viewModel: IRoundListViewModel = DefaultViewModel()) { + val lazyListState = rememberLazyListState() + val scope = rememberCoroutineScope() + + LazyColumn(state = lazyListState) { + itemsIndexed(viewModel.scores) { index, item -> + RoundListItem(item, index, lazyListState) + } + + scope.launch { + lazyListState.animateScrollToItem(viewModel.scores.size) + } + } + } + + @Composable + fun RoundListItem(round: Round, index: Int, lazyListState: LazyListState) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(all = 4.dp) + ) { + Text( + text = round.scoreA.toString(), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(5f), + textAlign = TextAlign.Center + ) + Text( + text = index.toString(), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(1f), + textAlign = TextAlign.Center + ) + Text( + text = round.scoreB.toString(), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(5f), + textAlign = TextAlign.Center + ) + } + } + + internal class DefaultViewModel() : IRoundListViewModel { + override var scores: List + get() = TODO("Not yet implemented") + set(value) {} + } + + } \ No newline at end of file diff --git a/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundListViewModel.kt b/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundListViewModel.kt index df5882b..739441d 100644 --- a/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundListViewModel.kt +++ b/app/src/main/java/me/zobrist/tichucounter/ui/counter/RoundListViewModel.kt @@ -1,61 +1,33 @@ package me.zobrist.tichucounter.ui.counter -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import me.zobrist.tichucounter.data.Round import me.zobrist.tichucounter.data.RoundDao -import me.zobrist.tichucounter.framework.SingleLiveEvent import javax.inject.Inject -@HiltViewModel -class RoundListViewModel @Inject constructor(private val roundDao: RoundDao) : ViewModel() { +interface IRoundListViewModel { + var scores: List +} - private val _historyA: MutableLiveData = MutableLiveData() - private val _historyB: MutableLiveData = MutableLiveData() - private val _scrollDown: SingleLiveEvent = SingleLiveEvent() +@HiltViewModel +class RoundListViewModel @Inject constructor(private val roundDao: RoundDao) : ViewModel(), + IRoundListViewModel { + + override var scores by mutableStateOf(emptyList()) init { viewModelScope.launch { - roundDao.getForActiveGame().collect { scores -> - update(scores) + roundDao.getForActiveGame().collect { + scores = it } } } - val historyA: LiveData - get() { - return _historyA - } - - val historyB: LiveData - get() { - return _historyB - } - - val scrollDown: LiveData - get() { - return _scrollDown - } - - 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 scrollDown() { - _scrollDown.value = true - } } diff --git a/app/src/main/res/layout/fragment_keyboard.xml b/app/src/main/res/layout/fragment_keyboard.xml deleted file mode 100644 index f75967f..0000000 --- a/app/src/main/res/layout/fragment_keyboard.xml +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - - - - - -