I had to create an auxiliary Boolean variable named wasCheated receiving false as default value in CheatActivity.kt. In fun setAnswerShownResult, I check if wasCheated is true, so first time I run the application, it’s not change its value. It is only changed when user click in Show Answer Button, changing wasCheated to true, and keeping this value in onSaveInstanceState. So if the application rotates, this value keeps true, forcing to fun setAnswerShownResult to create the Intent object to return through setResult fun. Here’s the code:
MainActivity.kt
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.ViewModelProviders
import java.lang.Exception
private const val TAG = "MainActivity"
private const val BUNDLE_KEY_INDEX = "index"
private const val REQUEST_CODE_CHEAT = 0
class MainActivity : AppCompatActivity() {
private lateinit var trueButton: Button
private lateinit var falseButton: Button
private lateinit var cheatButton: Button
private lateinit var nextButton: Button
private lateinit var questionTextView: TextView
private val quizViewModel: QuizViewModel by lazy {
ViewModelProviders.of(this).get(QuizViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate(Bundle?) called")
setContentView(R.layout.activity_main)
val currentIndex = savedInstanceState?.getInt(BUNDLE_KEY_INDEX, 0) ?: 0
quizViewModel.currentIndex = currentIndex
trueButton = findViewById(R.id.true_button)
falseButton = findViewById(R.id.false_button)
cheatButton = findViewById(R.id.cheat_button)
nextButton = findViewById(R.id.next_button)
questionTextView = findViewById(R.id.question_text_view);
trueButton.setOnClickListener { view: View ->
checkAnswer(true)
}
falseButton.setOnClickListener { view: View ->
checkAnswer(false)
}
nextButton.setOnClickListener { view: View ->
quizViewModel.moveToNext()
updateQuestion()
}
cheatButton.setOnClickListener { view: View ->
val answerIsTrue = quizViewModel.currentQuestionAnswer
val intent = CheatActivity.newIntent(this@MainActivity, answerIsTrue)
startActivityForResult(intent, REQUEST_CODE_CHEAT)
}
updateQuestion()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) {
return
}
if (requestCode == REQUEST_CODE_CHEAT) {
quizViewModel.isCheater =
data?.getBooleanExtra(EXTRA_ANSWER_SHOWN, false) ?: false
}
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart() called")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume() called")
}
override fun onPause() {
super.onPause()
Log.d(TAG, "onPause() called")
}
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
Log.d(TAG, "onSaveInstanceState")
savedInstanceState.putInt(BUNDLE_KEY_INDEX, quizViewModel.currentIndex)
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop() called")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy() called")
}
private fun updateQuestion() {
Log.d(TAG, "Updating question text", Exception())
val questionTextResId = quizViewModel.currentQuestionText
questionTextView.setText(questionTextResId)
}
private fun checkAnswer(userAnswer: Boolean) {
val correctAnswer = quizViewModel.currentQuestionAnswer
val messageResId = when {
quizViewModel.isCheater -> R.string.judgment_toast
userAnswer == correctAnswer -> R.string.correct_toast
else -> R.string.incorrect_toast
}
Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
}
}
CheatActivity.kt
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
const val EXTRA_ANSWER_SHOWN = "com.rpizzolato.geoquiz.answer_shown"
private const val EXTRA_ANSWER_IS_TRUE = "com.rpizzolato.geoquiz.answer_is_true"
private const val KEY_WAS_CHEATED = "was_cheated"
class CheatActivity : AppCompatActivity() {
private lateinit var answerTextView: TextView
private lateinit var showAnswerButton: Button
private var answerIsTrue = false
private var wasCheated = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_cheat)
wasCheated = savedInstanceState?.getBoolean(KEY_WAS_CHEATED, false) ?: false
setAnswerShownResult(wasCheated)
answerIsTrue = intent.getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false)
answerTextView = findViewById(R.id.answer_text_view)
showAnswerButton = findViewById(R.id.show_answer_button)
showAnswerButton.setOnClickListener {
wasCheated = true
setAnswerShownResult(true)
fillTextIfCheated()
}
fillTextIfCheated()
}
private fun fillTextIfCheated() {
if (wasCheated) {
val answerText = when {
answerIsTrue -> R.string.true_button
else -> R.string.false_button
}
answerTextView.setText(answerText)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(KEY_WAS_CHEATED, wasCheated)
}
private fun setAnswerShownResult(isAnswerShown: Boolean) {
if (wasCheated) {
val data = Intent().apply {
putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown)
}
setResult(Activity.RESULT_OK, data)
}
}
companion object {
fun newIntent(packageContext: Context, answerIsTrue: Boolean): Intent {
return Intent(packageContext, CheatActivity::class.java).apply {
putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue)
}
}
}
}
Please, if possible, making a code review would be very welcome, and comment if this solution works for you