Simplify database handling.
Some checks are pending
continuous-integration/drone/push Build is running
Some checks are pending
continuous-integration/drone/push Build is running
This commit is contained in:
@@ -2,11 +2,11 @@
|
|||||||
"formatVersion": 1,
|
"formatVersion": 1,
|
||||||
"database": {
|
"database": {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"identityHash": "f07e88c78e54c69c73890495a2121bf4",
|
"identityHash": "1739540cd7d5436941316932a1036d83",
|
||||||
"entities": [
|
"entities": [
|
||||||
{
|
{
|
||||||
"tableName": "Round",
|
"tableName": "Round",
|
||||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`gameId` INTEGER NOT NULL, `scoreA` INTEGER NOT NULL, `scoreB` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT)",
|
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`gameId` INTEGER NOT NULL, `scoreA` INTEGER NOT NULL, `scoreB` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fieldPath": "gameId",
|
"fieldPath": "gameId",
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
"fieldPath": "uid",
|
"fieldPath": "uid",
|
||||||
"columnName": "uid",
|
"columnName": "uid",
|
||||||
"affinity": "INTEGER",
|
"affinity": "INTEGER",
|
||||||
"notNull": false
|
"notNull": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"primaryKey": {
|
"primaryKey": {
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tableName": "Game",
|
"tableName": "Game",
|
||||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`active` INTEGER NOT NULL, `nameA` TEXT NOT NULL, `nameB` TEXT NOT NULL, `created` INTEGER NOT NULL, `modified` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT)",
|
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`active` INTEGER NOT NULL, `nameA` TEXT NOT NULL, `nameB` TEXT NOT NULL, `created` INTEGER NOT NULL, `modified` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fieldPath": "active",
|
"fieldPath": "active",
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
"fieldPath": "uid",
|
"fieldPath": "uid",
|
||||||
"columnName": "uid",
|
"columnName": "uid",
|
||||||
"affinity": "INTEGER",
|
"affinity": "INTEGER",
|
||||||
"notNull": false
|
"notNull": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"primaryKey": {
|
"primaryKey": {
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
"views": [],
|
"views": [],
|
||||||
"setupQueries": [
|
"setupQueries": [
|
||||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f07e88c78e54c69c73890495a2121bf4')"
|
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1739540cd7d5436941316932a1036d83')"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
102
app/schemas/me.zobrist.tichucounter.data.AppDatabase/2.json
Normal file
102
app/schemas/me.zobrist.tichucounter.data.AppDatabase/2.json
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"formatVersion": 1,
|
||||||
|
"database": {
|
||||||
|
"version": 2,
|
||||||
|
"identityHash": "1739540cd7d5436941316932a1036d83",
|
||||||
|
"entities": [
|
||||||
|
{
|
||||||
|
"tableName": "Round",
|
||||||
|
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`gameId` INTEGER NOT NULL, `scoreA` INTEGER NOT NULL, `scoreB` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldPath": "gameId",
|
||||||
|
"columnName": "gameId",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "scoreA",
|
||||||
|
"columnName": "scoreA",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "scoreB",
|
||||||
|
"columnName": "scoreB",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "uid",
|
||||||
|
"columnName": "uid",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primaryKey": {
|
||||||
|
"autoGenerate": true,
|
||||||
|
"columnNames": [
|
||||||
|
"uid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"indices": [],
|
||||||
|
"foreignKeys": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tableName": "Game",
|
||||||
|
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`active` INTEGER NOT NULL, `nameA` TEXT NOT NULL, `nameB` TEXT NOT NULL, `created` INTEGER NOT NULL, `modified` INTEGER NOT NULL, `uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldPath": "active",
|
||||||
|
"columnName": "active",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "nameA",
|
||||||
|
"columnName": "nameA",
|
||||||
|
"affinity": "TEXT",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "nameB",
|
||||||
|
"columnName": "nameB",
|
||||||
|
"affinity": "TEXT",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "created",
|
||||||
|
"columnName": "created",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "modified",
|
||||||
|
"columnName": "modified",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "uid",
|
||||||
|
"columnName": "uid",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"primaryKey": {
|
||||||
|
"autoGenerate": true,
|
||||||
|
"columnNames": [
|
||||||
|
"uid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"indices": [],
|
||||||
|
"foreignKeys": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"views": [],
|
||||||
|
"setupQueries": [
|
||||||
|
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||||
|
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1739540cd7d5436941316932a1036d83')"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@ package me.zobrist.tichucounter.data
|
|||||||
import androidx.room.Database
|
import androidx.room.Database
|
||||||
import androidx.room.RoomDatabase
|
import androidx.room.RoomDatabase
|
||||||
import androidx.room.TypeConverters
|
import androidx.room.TypeConverters
|
||||||
|
import me.zobrist.tichucounter.data.entity.Game
|
||||||
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
|
|
||||||
@Database(entities = [Round::class, Game::class], version = 1)
|
@Database(entities = [Round::class, Game::class], version = 1)
|
||||||
@TypeConverters(DateConverter::class)
|
@TypeConverters(DateConverter::class)
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
data class Game(
|
|
||||||
override var active: Boolean,
|
|
||||||
override var nameA: String,
|
|
||||||
override var nameB: String,
|
|
||||||
override val created: Date,
|
|
||||||
override var modified: Date,
|
|
||||||
@PrimaryKey(autoGenerate = true) override val uid: Long? = null
|
|
||||||
) : IGame, IEntity
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
data class GameAndScore(
|
|
||||||
override var active: Boolean,
|
|
||||||
override var nameA: String,
|
|
||||||
override var nameB: String,
|
|
||||||
override val created: Date,
|
|
||||||
override var modified: Date,
|
|
||||||
override var gameId: Long,
|
|
||||||
override var scoreA: Int,
|
|
||||||
override var scoreB: Int,
|
|
||||||
) : IGame, IRound
|
|
||||||
@@ -2,6 +2,7 @@ package me.zobrist.tichucounter.data
|
|||||||
|
|
||||||
import androidx.room.*
|
import androidx.room.*
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import me.zobrist.tichucounter.data.entity.Game
|
||||||
|
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
@@ -10,19 +11,13 @@ interface GameDao : DaoBase<Game> {
|
|||||||
@Query("SELECT * FROM game")
|
@Query("SELECT * FROM game")
|
||||||
fun getAll(): Flow<List<Game>>
|
fun getAll(): Flow<List<Game>>
|
||||||
|
|
||||||
@Query(
|
@Transaction
|
||||||
"SELECT active, " +
|
@Query("SELECT * FROM game where uid ")
|
||||||
"nameA, " +
|
fun getGamesWithRounds(): Flow<List<GameWithScores>>
|
||||||
"nameB, " +
|
|
||||||
"created, " +
|
@Transaction
|
||||||
"modified, " +
|
@Query("SELECT * FROM game WHERE active is 1")
|
||||||
"game.uid as gameId, " +
|
fun getActiveWithRounds(): Flow<GameWithScores?>
|
||||||
"COALESCE(SUM(round.scoreA), 0) as scoreA, " +
|
|
||||||
"COALESCE(SUM(round.scoreB), 0) as scoreB " +
|
|
||||||
"FROM game " +
|
|
||||||
"LEFT JOIN round ON round.gameId = game.uid GROUP BY game.uid ORDER BY modified DESC"
|
|
||||||
)
|
|
||||||
fun getAllWithPoints(): Flow<List<GameAndScore>>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM game WHERE uid is :gameId")
|
@Query("SELECT * FROM game WHERE uid is :gameId")
|
||||||
fun getGameById(gameId: Long): Flow<Game>
|
fun getGameById(gameId: Long): Flow<Game>
|
||||||
@@ -30,6 +25,7 @@ interface GameDao : DaoBase<Game> {
|
|||||||
@Query("SELECT * FROM game WHERE active is 1")
|
@Query("SELECT * FROM game WHERE active is 1")
|
||||||
fun getActive(): Flow<Game?>
|
fun getActive(): Flow<Game?>
|
||||||
|
|
||||||
|
|
||||||
@Query("UPDATE game SET active = 1 WHERE uid is :gameId;")
|
@Query("UPDATE game SET active = 1 WHERE uid is :gameId;")
|
||||||
fun setActive(gameId: Long)
|
fun setActive(gameId: Long)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package me.zobrist.tichucounter.data
|
||||||
|
|
||||||
|
import androidx.room.Embedded
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.Relation
|
||||||
|
import me.zobrist.tichucounter.data.entity.Game
|
||||||
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class GameWithScores(
|
||||||
|
@Embedded val game: Game,
|
||||||
|
@Relation(
|
||||||
|
parentColumn = "uid",
|
||||||
|
entityColumn = "gameId"
|
||||||
|
)
|
||||||
|
val rounds: List<Round>
|
||||||
|
)
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
interface IEntity {
|
|
||||||
val uid: Long?
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
interface IGame {
|
|
||||||
var active: Boolean
|
|
||||||
var nameA: String
|
|
||||||
var nameB: String
|
|
||||||
val created: Date
|
|
||||||
var modified: Date
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
interface IRound {
|
|
||||||
var gameId: Long
|
|
||||||
var scoreA: Int
|
|
||||||
var scoreB: Int
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package me.zobrist.tichucounter.data
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
data class Round(
|
|
||||||
override var gameId: Long,
|
|
||||||
override var scoreA: Int,
|
|
||||||
override var scoreB: Int,
|
|
||||||
@PrimaryKey(autoGenerate = true) override val uid: Long? = null
|
|
||||||
) : IRound, IEntity
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package me.zobrist.tichucounter.data
|
package me.zobrist.tichucounter.data
|
||||||
|
|
||||||
import androidx.room.*
|
import androidx.room.*
|
||||||
import kotlinx.coroutines.flow.Flow
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface RoundDao : DaoBase<Round> {
|
interface RoundDao : DaoBase<Round> {
|
||||||
@@ -12,20 +12,4 @@ interface RoundDao : DaoBase<Round> {
|
|||||||
@Query("SELECT * FROM round WHERE gameId is :gameId")
|
@Query("SELECT * FROM round WHERE gameId is :gameId")
|
||||||
fun getAllForGame(gameId: Long?): List<Round>
|
fun getAllForGame(gameId: Long?): List<Round>
|
||||||
|
|
||||||
@Query(
|
|
||||||
"SELECT gameId, SUM(scoreA) as scoreA, SUM(scoreB) as scoreB " +
|
|
||||||
"FROM round " +
|
|
||||||
"LEFT JOIN game ON game.uid = round.gameId " +
|
|
||||||
"WHERE game.active == 1"
|
|
||||||
)
|
|
||||||
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
|
|
||||||
fun getRoundSumForActiveGame(): Flow<Round>
|
|
||||||
|
|
||||||
@Query(
|
|
||||||
"SELECT gameId, scoreA, scoreB, round.uid " +
|
|
||||||
"FROM round " +
|
|
||||||
"LEFT JOIN game ON game.uid = round.gameId " +
|
|
||||||
"WHERE game.active == 1"
|
|
||||||
)
|
|
||||||
fun getForActiveGame(): Flow<List<Round>>
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package me.zobrist.tichucounter.data.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import me.zobrist.tichucounter.data.entity.IEntity
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class Game(
|
||||||
|
var active: Boolean,
|
||||||
|
var nameA: String,
|
||||||
|
var nameB: String,
|
||||||
|
val created: Date,
|
||||||
|
var modified: Date,
|
||||||
|
@PrimaryKey(autoGenerate = true) override val uid: Long = 0
|
||||||
|
) : IEntity
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package me.zobrist.tichucounter.data.entity
|
||||||
|
|
||||||
|
interface IEntity {
|
||||||
|
val uid: Long
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package me.zobrist.tichucounter.data.entity
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import me.zobrist.tichucounter.data.entity.IEntity
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class Round(
|
||||||
|
var gameId: Long,
|
||||||
|
var scoreA: Int,
|
||||||
|
var scoreB: Int,
|
||||||
|
@PrimaryKey(autoGenerate = true) override val uid: Long = 0
|
||||||
|
) : IEntity
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package me.zobrist.tichucounter.domain
|
||||||
|
|
||||||
|
import me.zobrist.tichucounter.data.GameWithScores
|
||||||
|
|
||||||
|
class GameWithScoresExtension {
|
||||||
|
}
|
||||||
|
|
||||||
|
fun GameWithScores.getTotalPoints(): Pair<Int, Int> {
|
||||||
|
var scoreA = 0
|
||||||
|
var scoreB = 0
|
||||||
|
|
||||||
|
this.rounds.forEach {
|
||||||
|
scoreA += it.scoreA
|
||||||
|
scoreB += it.scoreB
|
||||||
|
}
|
||||||
|
return Pair(scoreA, scoreB)
|
||||||
|
}
|
||||||
@@ -2,13 +2,13 @@ package me.zobrist.tichucounter.repository
|
|||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.take
|
import kotlinx.coroutines.flow.take
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import me.zobrist.tichucounter.data.Game
|
import me.zobrist.tichucounter.data.*
|
||||||
import me.zobrist.tichucounter.data.GameDao
|
import me.zobrist.tichucounter.data.entity.Game
|
||||||
import me.zobrist.tichucounter.data.Round
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
import me.zobrist.tichucounter.data.RoundDao
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -116,4 +116,12 @@ class GameRepository @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getActiveGameFlow(): Flow<GameWithScores?> {
|
||||||
|
return gameDao.getActiveWithRounds()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAllWithRoundFlow(): Flow<List<GameWithScores>> {
|
||||||
|
return gameDao.getGamesWithRounds()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -10,8 +10,7 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.zobrist.tichucounter.data.Round
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
import me.zobrist.tichucounter.data.RoundDao
|
|
||||||
import me.zobrist.tichucounter.domain.NavigationAction
|
import me.zobrist.tichucounter.domain.NavigationAction
|
||||||
import me.zobrist.tichucounter.domain.TopBarAction
|
import me.zobrist.tichucounter.domain.TopBarAction
|
||||||
import me.zobrist.tichucounter.repository.GameRepository
|
import me.zobrist.tichucounter.repository.GameRepository
|
||||||
@@ -19,8 +18,7 @@ import javax.inject.Inject
|
|||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class MainViewModel @Inject constructor(
|
class MainViewModel @Inject constructor(
|
||||||
private val gameRepository: GameRepository,
|
private val gameRepository: GameRepository
|
||||||
roundDao: RoundDao
|
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private var redoRounds = mutableStateListOf<Round>()
|
private var redoRounds = mutableStateListOf<Round>()
|
||||||
@@ -37,14 +35,18 @@ class MainViewModel @Inject constructor(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
roundDao.getForActiveGame().collect {
|
|
||||||
isUndoActionActive = it.isNotEmpty()
|
|
||||||
|
|
||||||
if (expectedRoundCount != it.count()) {
|
gameRepository.getActiveGameFlow().collect {
|
||||||
|
|
||||||
|
if (it != null) {
|
||||||
|
isUndoActionActive = it.rounds.isNotEmpty()
|
||||||
|
|
||||||
|
if (expectedRoundCount != it.rounds.count()) {
|
||||||
redoRounds.clear()
|
redoRounds.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedRoundCount = it.count()
|
expectedRoundCount = it.rounds.count()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.focus.FocusRequester
|
import androidx.compose.ui.focus.FocusRequester
|
||||||
import androidx.compose.ui.platform.LocalConfiguration
|
import androidx.compose.ui.platform.LocalConfiguration
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import me.zobrist.tichucounter.data.Round
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
import me.zobrist.tichucounter.ui.AppTheme
|
import me.zobrist.tichucounter.ui.AppTheme
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,10 +8,9 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.zobrist.tichucounter.data.GameDao
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
import me.zobrist.tichucounter.data.Round
|
|
||||||
import me.zobrist.tichucounter.data.RoundDao
|
|
||||||
import me.zobrist.tichucounter.domain.Tichu
|
import me.zobrist.tichucounter.domain.Tichu
|
||||||
|
import me.zobrist.tichucounter.domain.getTotalPoints
|
||||||
import me.zobrist.tichucounter.repository.GameRepository
|
import me.zobrist.tichucounter.repository.GameRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -48,9 +47,7 @@ interface ICounterViewModel {
|
|||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class CounterViewModel @Inject constructor(
|
class CounterViewModel @Inject constructor(
|
||||||
private val gameRepository: GameRepository,
|
private val gameRepository: GameRepository
|
||||||
private val roundDao: RoundDao,
|
|
||||||
private val gameDao: GameDao
|
|
||||||
) :
|
) :
|
||||||
ViewModel(), ICounterViewModel {
|
ViewModel(), ICounterViewModel {
|
||||||
|
|
||||||
@@ -112,24 +109,18 @@ class CounterViewModel @Inject constructor(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
roundDao.getForActiveGame().collect {
|
gameRepository.getActiveGameFlow().collect {
|
||||||
roundScoreList = it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModelScope.launch {
|
|
||||||
gameDao.getActive().collect {
|
|
||||||
if (it != null) {
|
if (it != null) {
|
||||||
teamNameA = it.nameA
|
|
||||||
teamNameB = it.nameB
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModelScope.launch {
|
val score = it.getTotalPoints()
|
||||||
roundDao.getRoundSumForActiveGame().collect { score ->
|
|
||||||
totalScoreA = score.scoreA
|
roundScoreList = it.rounds
|
||||||
totalScoreB = score.scoreB
|
totalScoreA = score.first
|
||||||
|
totalScoreB = score.second
|
||||||
|
|
||||||
|
teamNameA = it.game.nameA
|
||||||
|
teamNameB = it.game.nameB
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
|
|||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.zobrist.tichucounter.data.Round
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
import me.zobrist.tichucounter.ui.AppTheme
|
import me.zobrist.tichucounter.ui.AppTheme
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
@@ -15,7 +15,10 @@ import androidx.compose.ui.text.style.TextOverflow
|
|||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import me.zobrist.tichucounter.R
|
import me.zobrist.tichucounter.R
|
||||||
import me.zobrist.tichucounter.data.GameAndScore
|
import me.zobrist.tichucounter.data.entity.Game
|
||||||
|
import me.zobrist.tichucounter.data.GameWithScores
|
||||||
|
import me.zobrist.tichucounter.data.entity.Round
|
||||||
|
import me.zobrist.tichucounter.domain.getTotalPoints
|
||||||
import java.text.DateFormat
|
import java.text.DateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -65,7 +68,7 @@ fun DeleteConfirmDialog(show: Boolean = true, onExecuted: (Boolean) -> Unit = {}
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HistoryList(
|
fun HistoryList(
|
||||||
games: List<GameAndScore>,
|
games: List<GameWithScores>,
|
||||||
onOpenClicked: (GameId: Long) -> Unit,
|
onOpenClicked: (GameId: Long) -> Unit,
|
||||||
onDeleteClicked: (GameId: Long) -> Unit
|
onDeleteClicked: (GameId: Long) -> Unit
|
||||||
) {
|
) {
|
||||||
@@ -80,7 +83,7 @@ fun HistoryList(
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HistoryListItem(
|
fun HistoryListItem(
|
||||||
game: GameAndScore,
|
game: GameWithScores,
|
||||||
onOpenClicked: (GameId: Long) -> Unit,
|
onOpenClicked: (GameId: Long) -> Unit,
|
||||||
onDeleteClicked: (GameId: Long) -> Unit
|
onDeleteClicked: (GameId: Long) -> Unit
|
||||||
) {
|
) {
|
||||||
@@ -88,13 +91,15 @@ fun HistoryListItem(
|
|||||||
DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault())
|
DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault())
|
||||||
|
|
||||||
|
|
||||||
val cardColor = if (game.active) {
|
val cardColor = if (game.game.active) {
|
||||||
CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.secondaryContainer)
|
CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.secondaryContainer)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
CardDefaults.cardColors()
|
CardDefaults.cardColors()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val totalScores = game.getTotalPoints()
|
||||||
|
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
@@ -107,18 +112,18 @@ fun HistoryListItem(
|
|||||||
) {
|
) {
|
||||||
Column(Modifier.weight(4f)) {
|
Column(Modifier.weight(4f)) {
|
||||||
Text(
|
Text(
|
||||||
text = game.nameA + " vs " + game.nameB,
|
text = game.game.nameA + " vs " + game.game.nameB,
|
||||||
maxLines = 1,
|
maxLines = 1,
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
style = MaterialTheme.typography.headlineSmall
|
style = MaterialTheme.typography.headlineSmall
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
text = game.scoreA.toString() + " : " + game.scoreB.toString(),
|
text = totalScores.first.toString() + " : " + totalScores.second.toString(),
|
||||||
style = MaterialTheme.typography.bodyLarge
|
style = MaterialTheme.typography.bodyLarge
|
||||||
)
|
)
|
||||||
Spacer(modifier = Modifier.padding(5.dp))
|
Spacer(modifier = Modifier.padding(5.dp))
|
||||||
Text(
|
Text(
|
||||||
text = format.format(game.modified),
|
text = format.format(game.game.modified),
|
||||||
style = MaterialTheme.typography.labelSmall
|
style = MaterialTheme.typography.labelSmall
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -128,11 +133,11 @@ fun HistoryListItem(
|
|||||||
.width(70.dp)
|
.width(70.dp)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
ElevatedButton(onClick = { onOpenClicked(game.gameId) }, enabled = true) {
|
ElevatedButton(onClick = { onOpenClicked(game.game.uid) }, enabled = true) {
|
||||||
Icon(Icons.Outlined.OpenInFull, null)
|
Icon(Icons.Outlined.OpenInFull, null)
|
||||||
}
|
}
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onClick = { onDeleteClicked(game.gameId) }, enabled = !game.active
|
onClick = { onDeleteClicked(game.game.uid) }, enabled = !game.game.active
|
||||||
) {
|
) {
|
||||||
Icon(Icons.Outlined.Delete, null)
|
Icon(Icons.Outlined.Delete, null)
|
||||||
}
|
}
|
||||||
@@ -145,11 +150,26 @@ fun HistoryListItem(
|
|||||||
@Composable
|
@Composable
|
||||||
private fun HistoryListPreview() {
|
private fun HistoryListPreview() {
|
||||||
val tempData = listOf(
|
val tempData = listOf(
|
||||||
GameAndScore(true, "abc", "def", Date(), Date(), 1, 10, 50),
|
GameWithScores(
|
||||||
GameAndScore(false, "ADTH", "dogfg", Date(), Date(), 2, 20, 60),
|
Game(true, "abc", "def", Date(), Date()),
|
||||||
GameAndScore(false, "TeamA3 langer Name", "TeamB3", Date(), Date(), 3, 30, 70),
|
listOf(Round(1, 550, 500))
|
||||||
GameAndScore(false, "TeamA4", "TeamB4", Date(), Date(), 4, 40, 80),
|
),
|
||||||
GameAndScore(false, "TeamA5", "TeamB5", Date(), Date(), 5, 50, 90)
|
GameWithScores(
|
||||||
|
Game(false, "ADTH", "dogfg", Date(), Date()),
|
||||||
|
listOf(Round(2, 20, 60))
|
||||||
|
),
|
||||||
|
GameWithScores(
|
||||||
|
Game(false, "TeamA3 langer Name", "TeamB3", Date(), Date()),
|
||||||
|
listOf(Round(3, 30, 70))
|
||||||
|
),
|
||||||
|
GameWithScores(
|
||||||
|
Game(false, "TeamA4", "TeamB4", Date(), Date()),
|
||||||
|
listOf(Round(4, 40, 80))
|
||||||
|
),
|
||||||
|
GameWithScores(
|
||||||
|
Game(false, "TeamA5", "TeamB5", Date(), Date()),
|
||||||
|
listOf(Round(5, 50, 90))
|
||||||
|
)
|
||||||
)
|
)
|
||||||
HistoryList(tempData, {}) {}
|
HistoryList(tempData, {}) {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,24 +7,23 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import me.zobrist.tichucounter.data.GameAndScore
|
import me.zobrist.tichucounter.data.GameWithScores
|
||||||
import me.zobrist.tichucounter.data.GameDao
|
|
||||||
import me.zobrist.tichucounter.repository.GameRepository
|
import me.zobrist.tichucounter.repository.GameRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class HistoryViewModel @Inject constructor(
|
class HistoryViewModel @Inject constructor(
|
||||||
private val gameDao: GameDao,
|
|
||||||
private val gameRepository: GameRepository
|
private val gameRepository: GameRepository
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
var gameAndHistory by mutableStateOf(emptyList<GameAndScore>())
|
var gameAndHistory by mutableStateOf(emptyList<GameWithScores>())
|
||||||
private set
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
gameDao.getAllWithPoints().collect { games ->
|
|
||||||
|
gameRepository.getAllWithRoundFlow().collect() { games ->
|
||||||
gameAndHistory = games
|
gameAndHistory = games
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user