fix: manually state restore #132

Closed
septs wants to merge 1 commit from septs:manually-state-restore into master
2 changed files with 48 additions and 37 deletions

View file

@ -194,28 +194,27 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
abstract class DownloadWizardStepFragment : Fragment(), OpenEuiccContextMarker {
protected val state: DownloadWizardState
get() = (requireActivity() as DownloadWizardActivity).state
get() = wizardActivity.state
abstract val hasNext: Boolean
abstract val hasPrev: Boolean
abstract fun createNextFragment(): DownloadWizardStepFragment?
abstract fun createPrevFragment(): DownloadWizardStepFragment?
private val wizardActivity: DownloadWizardActivity
get() = requireActivity() as DownloadWizardActivity
protected fun gotoNextFragment(next: DownloadWizardStepFragment? = null) {
val realNext = next ?: createNextFragment()
(requireActivity() as DownloadWizardActivity).showFragment(
realNext!!,
R.anim.slide_in_right,
R.anim.slide_out_left
)
wizardActivity.showFragment(realNext!!, R.anim.slide_in_right, R.anim.slide_out_left)
}
protected fun hideProgressBar() {
(requireActivity() as DownloadWizardActivity).progressBar.visibility = View.GONE
wizardActivity.progressBar.visibility = View.GONE
}
protected fun showProgressBar(progressValue: Int) {
(requireActivity() as DownloadWizardActivity).progressBar.apply {
wizardActivity.progressBar.apply {
visibility = View.VISIBLE
if (progressValue >= 0) {
isIndeterminate = false
@ -227,7 +226,7 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
}
protected fun refreshButtons() {
(requireActivity() as DownloadWizardActivity).refreshButtons()
wizardActivity.refreshButtons()
}
open fun beforeNext() {}

View file

@ -5,11 +5,19 @@ import android.util.Patterns
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.core.widget.addTextChangedListener
import com.google.android.material.textfield.TextInputLayout
import im.angry.openeuicc.common.R
class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepFragment() {
companion object {
const val FIELD_SMDP = "smdp"
const val FIELD_MATCHING_ID = "matchingId"
const val FIELD_CONFIRMATION_CODE = "confirmationCode"
const val FIELD_IMEI = "imei"
}
private var inputComplete = false
override val hasNext: Boolean
@ -17,17 +25,17 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF
override val hasPrev: Boolean
get() = true
private lateinit var smdp: TextInputLayout
private lateinit var matchingId: TextInputLayout
private lateinit var confirmationCode: TextInputLayout
private lateinit var imei: TextInputLayout
private lateinit var smdp: EditText
private lateinit var matchingId: EditText
private lateinit var confirmationCode: EditText
private lateinit var imei: EditText
override fun beforeNext() {
state.smdp = smdp.editText!!.text.toString().trim()
state.smdp = smdp.text.toString().trim()
// Treat empty inputs as null -- this is important for the download step
state.matchingId = matchingId.editText!!.text.toString().trim().ifBlank { null }
state.confirmationCode = confirmationCode.editText!!.text.toString().trim().ifBlank { null }
state.imei = imei.editText!!.text.toString().ifBlank { null }
state.matchingId = matchingId.text.toString().trim().ifBlank { null }
state.confirmationCode = confirmationCode.text.toString().trim().ifBlank { null }
state.imei = imei.text.toString().ifBlank { null }
}
override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment =
@ -40,29 +48,33 @@ class DownloadWizardDetailsFragment : DownloadWizardActivity.DownloadWizardStepF
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_download_details, container, false)
smdp = view.requireViewById(R.id.profile_download_server)
matchingId = view.requireViewById(R.id.profile_download_code)
confirmationCode = view.requireViewById(R.id.profile_download_confirmation_code)
imei = view.requireViewById(R.id.profile_download_imei)
smdp.editText!!.addTextChangedListener {
updateInputCompleteness()
}
return view
}
override fun onStart() {
super.onStart()
smdp.editText!!.setText(state.smdp)
matchingId.editText!!.setText(state.matchingId)
confirmationCode.editText!!.setText(state.confirmationCode)
imei.editText!!.setText(state.imei)
updateInputCompleteness()
): View? = inflater.inflate(R.layout.fragment_download_details, container, false).apply {
smdp = requireViewById<TextInputLayout>(R.id.profile_download_server).editText!!
matchingId = requireViewById<TextInputLayout>(R.id.profile_download_code).editText!!
confirmationCode = requireViewById<TextInputLayout>(R.id.profile_download_confirmation_code).editText!!
imei = requireViewById<TextInputLayout>(R.id.profile_download_imei).editText!!
smdp.addTextChangedListener { updateInputCompleteness() }
}
private fun updateInputCompleteness() {
inputComplete = Patterns.DOMAIN_NAME.matcher(smdp.editText!!.text).matches()
inputComplete = Patterns.DOMAIN_NAME.matcher(smdp.text).matches()
refreshButtons()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString(FIELD_SMDP, smdp.text.toString())
Review

DownloadWizardActivity already has state. We should just store it there in this function.

That would remove the need for onViewStateRestored as well.

`DownloadWizardActivity` already has state. We should just store it there in this function. That would remove the need for `onViewStateRestored` as well.
outState.putString(FIELD_MATCHING_ID, matchingId.text.toString())
outState.putString(FIELD_CONFIRMATION_CODE, confirmationCode.text.toString())
outState.putString(FIELD_IMEI, imei.text.toString())
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
smdp.setText(savedInstanceState?.getString(FIELD_SMDP) ?: state.smdp)
matchingId.setText(savedInstanceState?.getString(FIELD_MATCHING_ID) ?: state.matchingId)
confirmationCode.setText(savedInstanceState?.getString(FIELD_CONFIRMATION_CODE) ?: state.confirmationCode)
imei.setText(savedInstanceState?.getString(FIELD_IMEI) ?: state.imei)
updateInputCompleteness()
}
}