V2 initialization
This commit is contained in:
		| @ -1,23 +0,0 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.os.Bundle | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.text.method.LinkMovementMethod | ||||
| import android.view.MenuItem | ||||
| import android.widget.TextView | ||||
|  | ||||
|  | ||||
| class CreditsActivity : AppCompatActivity() { | ||||
|     override fun onCreate(savedInstanceState: Bundle?) { | ||||
|         super.onCreate(savedInstanceState) | ||||
|         setContentView(R.layout.activity_credits) | ||||
|         setSupportActionBar(findViewById(R.id.toolbar)) | ||||
|         supportActionBar?.setDisplayHomeAsUpEnabled(true) | ||||
|         findViewById<TextView>(R.id.iconsCredit)?.movementMethod = LinkMovementMethod.getInstance() | ||||
|     } | ||||
|  | ||||
|     override fun onOptionsItemSelected(item: MenuItem): Boolean { | ||||
|         finish() | ||||
|         return true | ||||
|     } | ||||
| } | ||||
| @ -1,59 +0,0 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.app.AlertDialog | ||||
| import android.content.DialogInterface | ||||
| import android.content.Intent | ||||
| import android.os.Bundle | ||||
| import android.support.v4.app.DialogFragment | ||||
|  | ||||
|  | ||||
| class EndOfMatchDialog: DialogFragment() { | ||||
|     override fun onCreateDialog(savedInstanceState: Bundle?)= | ||||
|             AlertDialog.Builder(activity).apply{ | ||||
|                 val players = (activity as MainActivity).players | ||||
|                 val names = players.map { it.name } | ||||
|                 val winnerName = players.maxBy { it.score }?.name ?: "" | ||||
|                 val score = players.map { it.score }.sortedDescending() | ||||
|  | ||||
|                 setTitle(getString(R.string.end_match_dialog_title, winnerName)) | ||||
|                 setMessage(getString(R.string.score, score[0], score[1])) | ||||
|                 setPositiveButton( | ||||
|                         R.string.new_match, | ||||
|                         DialogInterface.OnClickListener { dialog, id -> | ||||
|                             startActivity( | ||||
|                                     Intent(context, MainActivity::class.java).apply { | ||||
|                                         putExtra("names", names.toTypedArray()) | ||||
|                                     } | ||||
|                             ) | ||||
|                         } | ||||
|                 ) | ||||
|                 setNeutralButton( | ||||
|                         R.string.share_button, | ||||
|                         DialogInterface.OnClickListener { dialog, id -> | ||||
|                             val newMatchIntent: Intent = Intent().apply { | ||||
|                                 action = Intent.ACTION_SEND | ||||
|                                 putExtra( | ||||
|                                         Intent.EXTRA_SUBJECT, | ||||
|                                         getString( | ||||
|                                                 R.string.share_subject, | ||||
|                                                 names[Side.LEFT.value], | ||||
|                                                 names[Side.RIGHT.value] | ||||
|                                         ) | ||||
|                                 ) | ||||
|                                 putExtra( | ||||
|                                         Intent.EXTRA_TEXT, | ||||
|                                         getString(R.string.share_message, | ||||
|                                                 names[Side.LEFT.value], | ||||
|                                                 names[Side.RIGHT.value], | ||||
|                                                 winnerName, | ||||
|                                                 score[0], | ||||
|                                                 score[1] | ||||
|                                         ) | ||||
|                                 ) | ||||
|                                 type = "text/plain" | ||||
|                             } | ||||
|                             startActivity(newMatchIntent) | ||||
|                         } | ||||
|                 ) | ||||
|             }.create() | ||||
|         } | ||||
| @ -1,181 +0,0 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.content.Intent | ||||
| import android.content.pm.ActivityInfo | ||||
| import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.support.v7.app.AppCompatDelegate | ||||
| import android.view.Menu | ||||
| import android.view.MenuItem | ||||
| import android.view.View | ||||
| import android.widget.Button | ||||
| import android.widget.ImageView | ||||
| import android.widget.Toast | ||||
|  | ||||
|  | ||||
| class MainActivity : AppCompatActivity() { | ||||
|     var players: Array<Player> = emptyArray() | ||||
|     var serviceSide: Side = Side.LEFT | ||||
|     var relaunchSide: Side = Side.RIGHT | ||||
|     var textScore: android.widget.TextView? = null | ||||
|     var textService: android.widget.TextView? = null | ||||
|     var buttons: Array<Button> = emptyArray() | ||||
|     var imageViews: Array<ImageView?> = emptyArray() | ||||
|     var history: MutableList<State> = ArrayList() | ||||
|     var step: Int = 0 | ||||
|     var undo: MenuItem? = null | ||||
|     var redo: MenuItem? = null | ||||
|  | ||||
|     override fun onCreate(savedInstanceState: Bundle?) { | ||||
|         super.onCreate(savedInstanceState) | ||||
|         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) | ||||
|         setContentView(R.layout.activity_main) | ||||
|         setSupportActionBar(findViewById(R.id.toolbar)) | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { | ||||
|             requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE | ||||
|         } | ||||
|  | ||||
|         var names: Array<String> = intent.getStringArrayExtra("names") ?: resources.getStringArray(R.array.default_players_names) | ||||
|         players = arrayOf( | ||||
|                 Player(names[Side.LEFT.value]), | ||||
|                 Player(names[Side.RIGHT.value]) | ||||
|         ) | ||||
|         textScore = findViewById(R.id.textScore) | ||||
|         textService = findViewById(R.id.textService) | ||||
|         buttons = arrayOf( | ||||
|                 findViewById(R.id.buttonLeftPlayer), | ||||
|                 findViewById(R.id.buttonRightPlayer) | ||||
|         ) | ||||
|         imageViews = arrayOf( | ||||
|                 findViewById(R.id.imgLeftService), | ||||
|                 findViewById(R.id.imgRightService) | ||||
|         ) | ||||
|         updateUI() | ||||
|         StarterNameDialog().show( supportFragmentManager, "StarterNameDialog") | ||||
|     } | ||||
|  | ||||
|     override fun onCreateOptionsMenu(menu: Menu): Boolean { | ||||
|         menuInflater.inflate(R.menu.main, 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 -> { | ||||
|             step-- | ||||
|             reloadState() | ||||
|             redo?.isVisible = true | ||||
|             true | ||||
|         } | ||||
|         R.id.action_redo -> { | ||||
|             step++ | ||||
|             reloadState() | ||||
|             undo?.isVisible = true | ||||
|             true | ||||
|         } | ||||
|         R.id.action_new_match -> { | ||||
|             startActivity( | ||||
|                     Intent(this, MainActivity::class.java).apply { | ||||
|                         putExtra("names", players.map{ it.name }.toTypedArray()) | ||||
|                     } | ||||
|             ) | ||||
|             true | ||||
|         } | ||||
|         R.id.action_about -> { | ||||
|             startActivity(Intent(this, CreditsActivity::class.java)) | ||||
|             true | ||||
|         } | ||||
|         else -> { | ||||
|             super.onOptionsItemSelected(item) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun saveState() { | ||||
|         val state = State(players.map { it.score }, serviceSide) | ||||
|         if (step == history.size) { | ||||
|             history.add(state) | ||||
|         } else { | ||||
|             history[step] = state | ||||
|             history = history.subList(0, step+1).toMutableList() | ||||
|         } | ||||
|         if (step > 0) { | ||||
|             undo?.isVisible = true | ||||
|         } | ||||
|         redo?.isVisible = false | ||||
|     } | ||||
|  | ||||
|     fun reloadState() { | ||||
|         history[step].let{ | ||||
|             players.zip(it.score).forEach{(player, score) -> player.score = score} | ||||
|             serviceSide = it.serviceSide | ||||
|             relaunchSide = when(serviceSide) { | ||||
|                 Side.LEFT -> Side.RIGHT | ||||
|                 Side.RIGHT -> Side.LEFT | ||||
|             } | ||||
|         } | ||||
|         when(step){ | ||||
|             0 -> undo?.isVisible = false | ||||
|             history.size - 1 -> redo?.isVisible = false | ||||
|         } | ||||
|         this.step = step | ||||
|         updateUI() | ||||
|     } | ||||
|  | ||||
|     fun setStarterName(serviceSide: Side, names: Collection<String>) { | ||||
|         players.zip(names).forEach { (player, name) -> player.name = name} | ||||
|         this.serviceSide = serviceSide | ||||
|         relaunchSide = when(serviceSide) { | ||||
|             Side.LEFT -> Side.RIGHT | ||||
|             Side.RIGHT -> Side.LEFT | ||||
|         } | ||||
|         saveState() | ||||
|         updateUI() | ||||
|         Toast.makeText(applicationContext, R.string.info, Toast.LENGTH_LONG).show() | ||||
|     } | ||||
|  | ||||
|     fun updateUI() { | ||||
|         textScore?.text = getString(R.string.score, players[serviceSide.value].score, players[relaunchSide.value].score) | ||||
|         textService?.text = getString(R.string.service, players[serviceSide.value].name) | ||||
|  | ||||
|         for ((button, player) in buttons.zip(players)) { | ||||
|             button.text = fromHtml(getString(R.string.button_text, player.name, player.score)) | ||||
|         } | ||||
|  | ||||
|         when (serviceSide) { | ||||
|             Side.LEFT -> { | ||||
|                 imageViews[Side.LEFT.value]?.setImageResource(R.drawable.ic_left_service) | ||||
|                 imageViews[Side.RIGHT.value]?.setImageResource(0) | ||||
|             } | ||||
|             Side.RIGHT -> { | ||||
|                 imageViews[Side.LEFT.value]?.setImageResource(0) | ||||
|                 imageViews[Side.RIGHT.value]?.setImageResource(R.drawable.ic_right_service) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun updateScore(view: View) { | ||||
|         for (side in enumValues<Side>()) { | ||||
|             if (view == buttons[side.value]) { | ||||
|                 if (!matchIsFinished()) { | ||||
|                     step++ | ||||
|                     players[side.value].score++ | ||||
|                     if ((players.sumBy { it.score } % 2 == 0) or (players.all { it.score >= 10 })) { | ||||
|                         serviceSide = relaunchSide.also { relaunchSide = serviceSide } | ||||
|                     } | ||||
|                     saveState() | ||||
|                     updateUI() | ||||
|                 } | ||||
|                 if (matchIsFinished()) { | ||||
|                     EndOfMatchDialog().show(supportFragmentManager, "EndOfMatchDialog") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun matchIsFinished(): Boolean { | ||||
|         val (minScore, maxScore) = players.map { it.score }.sorted() | ||||
|         return (maxScore >= 11) and (maxScore - minScore >= 2) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										8
									
								
								app/src/main/java/adrienmalin/pingpoints/MatchModel.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								app/src/main/java/adrienmalin/pingpoints/MatchModel.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| class MatchModel : ViewModel() { | ||||
|     var players: List<Player> = ListOf(Player(), Player()) | ||||
|     var server: Int = 0 | ||||
|     var ttsEnabled: Boolean = False | ||||
|     var sttEnabled: Boolean = False | ||||
| } | ||||
							
								
								
									
										6
									
								
								app/src/main/java/adrienmalin/pingpoints/Play.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								app/src/main/java/adrienmalin/pingpoints/Play.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| data class Play { | ||||
|     val score: List<Int>, | ||||
|     val server: Int | ||||
| } | ||||
							
								
								
									
										6
									
								
								app/src/main/java/adrienmalin/pingpoints/Player.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								app/src/main/java/adrienmalin/pingpoints/Player.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| data class Player { | ||||
|     var name: String = "", | ||||
|     var score: Int = 0 | ||||
| } | ||||
| @ -0,0 +1,12 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.support.v7.app.AppCompatActivity | ||||
| import android.os.Bundle | ||||
|  | ||||
| class StarterNameActivity : AppCompatActivity() { | ||||
|  | ||||
|     override fun onCreate(savedInstanceState: Bundle?) { | ||||
|         super.onCreate(savedInstanceState) | ||||
|         setContentView(R.layout.activity_starter_name) | ||||
|     } | ||||
| } | ||||
| @ -1,42 +0,0 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.app.AlertDialog | ||||
| import android.content.Context | ||||
| import android.os.Bundle | ||||
| import android.support.v4.app.DialogFragment | ||||
| import android.view.LayoutInflater | ||||
| import android.view.View | ||||
| import android.widget.EditText | ||||
| import android.widget.RadioGroup | ||||
| import android.widget.TextView | ||||
|  | ||||
|  | ||||
| class StarterNameDialog : DialogFragment() { | ||||
|     override fun onCreateDialog(savedInstanceState: Bundle?) = | ||||
|             AlertDialog.Builder(activity).apply { | ||||
|                 val mainActivity = activity as MainActivity | ||||
|                 val inflater:LayoutInflater = context?.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater | ||||
|                 val namesView: View = inflater.inflate(R.layout.starter_name_dialog, null) | ||||
|                 val inputsPlayersNames: Array<EditText?> = arrayOf( | ||||
|                         namesView.findViewById(R.id.inputLeftPlayerName), | ||||
|                         namesView.findViewById(R.id.inputRightPlayerName) | ||||
|                 ) | ||||
|  | ||||
|                 inputsPlayersNames.zip(mainActivity.players.map{ it.name }).forEach { (inputPlayerName, name) -> | ||||
|                     inputPlayerName?.setText(name, TextView.BufferType.EDITABLE) | ||||
|                 } | ||||
|  | ||||
|                 setTitle(R.string.starter_name_dialog_message) | ||||
|                 setView(namesView) | ||||
|                 setPositiveButton(R.string.go_button) { dialog, id -> | ||||
|                     dismiss() | ||||
|                     mainActivity.setStarterName( | ||||
|                             when (namesView.findViewById<RadioGroup>(R.id.radioGroup)?.checkedRadioButtonId) { | ||||
|                                 R.id.radioLeftPlayer -> Side.LEFT | ||||
|                                 else -> Side.RIGHT | ||||
|                             }, | ||||
|                             inputsPlayersNames.map{ it?.text.toString() } | ||||
|                     ) | ||||
|                 } | ||||
|             }.create() | ||||
|         } | ||||
| @ -1,33 +0,0 @@ | ||||
| package adrienmalin.pingpoints | ||||
|  | ||||
| import android.os.Build | ||||
| import android.text.Html | ||||
| import android.text.Spanned | ||||
|  | ||||
|  | ||||
| data class Player( | ||||
|         var name: String, | ||||
|         var score: Int = 0 | ||||
| ) | ||||
|  | ||||
|  | ||||
| enum class Side(val value:Int) { | ||||
|     LEFT(0), | ||||
|     RIGHT(1) | ||||
| } | ||||
|  | ||||
|  | ||||
| data class State( | ||||
|         val score: List<Int>, | ||||
|         val serviceSide: Side | ||||
| ) | ||||
|  | ||||
| @SuppressWarnings("deprecation") | ||||
| fun fromHtml(html: String): Spanned { | ||||
|     return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | ||||
|         Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY) | ||||
|     } else { | ||||
|         Html.fromHtml(html) | ||||
|  | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user