MatchActivity almost finished. Started VictoryActivity
This commit is contained in:
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -2,5 +2,5 @@ package adrienmalin.pingpoints
|
||||
|
||||
data class Play (
|
||||
val score: List<Int>,
|
||||
val server: Int
|
||||
val serviceSide: Int
|
||||
)
|
@ -1,6 +1,6 @@
|
||||
package adrienmalin.pingpoints
|
||||
|
||||
data class Player (
|
||||
var name: String = "",
|
||||
var name: String,
|
||||
var score: Int = 0
|
||||
)
|
@ -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)
|
||||
|
12
app/src/main/java/adrienmalin/pingpoints/VictoryActivity.kt
Normal file
12
app/src/main/java/adrienmalin/pingpoints/VictoryActivity.kt
Normal 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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user