MatchActivity almost finished. Started VictoryActivity

This commit is contained in:
adrienmalin
2018-12-04 15:50:07 +01:00
parent f2a2f8859b
commit 46333265bd
18 changed files with 505 additions and 344 deletions

View File

@ -7,25 +7,37 @@ import android.view.View
import android.arch.lifecycle.ViewModelProviders
import android.speech.tts.TextToSpeech
import android.support.design.widget.Snackbar
import android.text.method.LinkMovementMethod
import android.view.Menu
import android.view.MenuItem
import android.widget.*
const val REQ_CODE_SPEECH_INPUT = 1
class MatchActivity : AppCompatActivity() {
var matchModel: MatchModel? = null
var textScore: android.widget.TextView? = null
var textService: android.widget.TextView? = null
var buttons: Array<Button> = emptyArray()
var imageViews: Array<ImageView?> = emptyArray()
var matchModel: MatchModel? = null
var tts: TextToSpeech? = null
var undo: MenuItem? = null
var redo: MenuItem? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
setContentView(R.layout.activity_match)
setSupportActionBar(findViewById(R.id.toolbar))
// Set HTML text for icons credits
findViewById<TextView>(R.id.iconsCredit).run {
setText(fromHtml(getString(R.string.iconCredits)))
movementMethod = LinkMovementMethod.getInstance()
}
// Find views
textScore = findViewById(R.id.textScore)
textService = findViewById(R.id.textService)
buttons = arrayOf(
@ -36,75 +48,122 @@ class MatchActivity : AppCompatActivity() {
findViewById(R.id.imgService0),
findViewById(R.id.imgService1)
)
val matchModel = ViewModelProviders.of(this).get(MatchModel::class.java)
if (!matchModel.matchStarted) {
matchModel.startMatch(
intent.getStringExtra("player1Name"),
intent.getStringExtra("player2Name"),
intent.getIntExtra("starterId", 0),
intent.getBooleanExtra("enableTTS", false),
intent.getBooleanExtra("enableSTT", false)
)
if (matchModel.ttsEnabled) {
tts = TextToSpeech(
this,
TextToSpeech.OnInitListener {
fun onInit(status: Int) {}
}
// Init or restore ViewModel
matchModel = ViewModelProviders.of(this).get(MatchModel::class.java)
matchModel?.let {
if (!it.matchStarted) {
it.startMatch(
intent.getStringExtra("player1Name"),
intent.getStringExtra("player2Name"),
intent.getIntExtra("starterId", 0),
intent.getBooleanExtra("enableTTS", false),
intent.getBooleanExtra("enableSTT", false)
)
if (it.ttsEnabled) {
tts = TextToSpeech(
this,
TextToSpeech.OnInitListener {
fun onInit(status: Int) {}
}
)
}
Snackbar.make(
findViewById(R.id.coordinatorLayout),
R.string.button_hint,
Snackbar.LENGTH_SHORT
).show()
}
Snackbar.make(
findViewById(R.id.coordinatorLayout),
R.string.button_hint,
Snackbar.LENGTH_SHORT
).show()
}
updateUI()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.match_menu, menu)
undo = menu.findItem(R.id.action_undo)
redo = menu.findItem(R.id.action_redo)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.action_undo -> {
matchModel?.undo()
updateUI()
true
}
R.id.action_redo -> {
matchModel?.redo()
updateUI()
true
}
else -> {
super.onOptionsItemSelected(item)
}
}
fun updateUI() {
matchModel?.apply {
textScore?.text = getString(
R.string.score,
players[serviceSide].score,
players[relaunchSide].score
)
textService?.text = getString(R.string.service, players[serviceSide].name)
if (matchFinished) {
for ((button, player) in buttons.zip(players)) {
button.text = fromHtml(getString(R.string.button_text, player.name, player.score))
}
when (serviceSide) {
0 -> {
imageViews[0]?.setImageResource(R.drawable.ic_service_0)
imageViews[1]?.setImageResource(0)
}
else -> {
imageViews[0]?.setImageResource(0)
imageViews[1]?.setImageResource(R.drawable.ic_service_1)
}
}
if (ttsEnabled) {
tts?.speak(
getString(
R.string.update_score_speech,
players[serviceSide].score,
players[relaunchSide].score,
players[serviceSide].name
),
TextToSpeech.QUEUE_FLUSH,
hashMapOf(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID to "MessageId")
} else {
textScore?.text = getString(
R.string.score,
players[serviceSide].score,
players[relaunchSide].score
)
textService?.text = getString(R.string.service, players[serviceSide].name)
for ((button, player) in buttons.zip(players)) {
button.text = fromHtml(getString(R.string.button_text, player.name, player.score))
}
when (serviceSide) {
0 -> {
imageViews[0]?.setImageResource(R.drawable.ic_service_0)
imageViews[1]?.setImageResource(0)
}
else -> {
imageViews[0]?.setImageResource(0)
imageViews[1]?.setImageResource(R.drawable.ic_service_1)
}
}
undo?.isVisible = when (playId) {
0 -> false
else -> true
}
redo?.isVisible = when (playId) {
history.size - 1 -> false
else -> true
}
if (ttsEnabled) {
tts?.speak(
getString(
R.string.update_score_speech,
players[serviceSide].score,
players[relaunchSide].score,
players[serviceSide].name
),
TextToSpeech.QUEUE_FLUSH,
hashMapOf(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID to "MessageId")
)
}
}
}
}
fun updateScore(view: View) {
matchModel?.apply {
if (!matchFinished) {
for (side in 0..1) {
if (view == buttons[side]) {
updateScore(side)
}
}
updateUI()
}
}
}
}

View File

@ -7,21 +7,69 @@ import android.arch.lifecycle.ViewModel
class MatchModel : ViewModel() {
var matchStarted: Boolean = false
var matchFinished: Boolean = false
var players: List<Player> = emptyList()
var serviceSide: Int = 0
var relaunchSide: Int = 1
var ttsEnabled: Boolean = false
var sttEnabled: Boolean = false
var playId: Int = 0
var history: MutableList<Play> = ArrayList()
fun startMatch(player1Name: String, player2Name:String, starterId: Int, enableTTS: Boolean, enableSTT: Boolean) {
matchStarted = true
players = listOf(Player(player1Name), Player(player2Name))
serviceSide = starterId
relaunchSide = when(starterId) {
relaunchSide = when(serviceSide) {
0 -> 1
else -> 0
}
ttsEnabled = enableTTS
sttEnabled = enableSTT
saveState()
}
fun updateScore(scorerId: Int) {
playId++
players[scorerId].score++
if ((players.sumBy { it.score } % 2 == 0) or (players.all { it.score >= 10 })) {
serviceSide = relaunchSide.also { relaunchSide = serviceSide }
}
saveState()
// Is match finished?
val (minScore, maxScore) = players.map { it.score }.sorted()
if ((maxScore >= 11) and (maxScore - minScore >= 2)) matchFinished = true
}
fun saveState() {
val play = Play(players.map { it.score }, serviceSide)
if (playId == history.size) {
history.add(play)
} else {
history[playId] = play
history = history.subList(0, playId+1).toMutableList()
}
}
fun undo() {
playId--
reloadState()
}
fun redo() {
playId++
reloadState()
}
fun reloadState() {
history[playId].let{
players.zip(it.score).forEach{(player, score) -> player.score = score}
serviceSide = it.serviceSide
relaunchSide = when(serviceSide) {
0 -> 1
else -> 0
}
}
}
}

View File

@ -2,5 +2,5 @@ package adrienmalin.pingpoints
data class Play (
val score: List<Int>,
val server: Int
val serviceSide: Int
)

View File

@ -1,6 +1,6 @@
package adrienmalin.pingpoints
data class Player (
var name: String = "",
var name: String,
var score: Int = 0
)

View File

@ -37,11 +37,7 @@ class StarterNameActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_starter_name)
setSupportActionBar(findViewById(R.id.toolbar))
// Set HTML text for icons credits
findViewById<TextView>(R.id.iconsCredit).run {
setText(fromHtml(getString(R.string.iconCredits)))
movementMethod = LinkMovementMethod.getInstance()
}
// Find views
player1NameInput = findViewById(R.id.player1Name)
player2NameInput = findViewById(R.id.player2Name)

View File

@ -0,0 +1,12 @@
package adrienmalin.pingpoints
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class VictoryActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_victory)
}
}