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