From e83c6dc7c2f671530d2d52c99df4ecf74a49318d Mon Sep 17 00:00:00 2001 From: Nicholas Tinsley Date: Thu, 8 Aug 2024 11:47:56 -0400 Subject: [PATCH] Prevent ISE during code entry in registration. --- .../ui/entercode/EnterCodeFragment.kt | 30 +++++++++------ .../ui/entercode/EnterCodeState.kt | 8 ++++ .../ui/entercode/EnterCodeViewModel.kt | 37 +++++++++++++++++++ 3 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeState.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeViewModel.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt index 49486d7e26..977cec9dd0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeFragment.kt @@ -11,6 +11,7 @@ import android.view.View import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -47,6 +48,7 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c private val TAG = Log.tag(EnterCodeFragment::class.java) private val sharedViewModel by activityViewModels() + private val fragmentViewModel by viewModels() private val bottomSheet = ContactSupportBottomSheetFragment() private val binding: FragmentRegistrationEnterCodeBinding by ViewBinderDelegate(FragmentRegistrationEnterCodeBinding::bind) @@ -130,6 +132,20 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c binding.keyboard.displayKeyboard() } } + + fragmentViewModel.uiState.observe(viewLifecycleOwner) { + if (it.resetRequiredAfterFailure) { + binding.callMeCountDown.visibility = View.VISIBLE + binding.resendSmsCountDown.visibility = View.VISIBLE + binding.wrongNumber.visibility = View.VISIBLE + binding.code.clear() + binding.keyboard.displayKeyboard() + fragmentViewModel.allViewsResetCompleted() + } else if (it.showKeyboard) { + binding.keyboard.displayKeyboard() + fragmentViewModel.keyboardShown() + } + } } override fun onResume() { @@ -190,11 +206,7 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c setTitle(R.string.RegistrationActivity_too_many_attempts) setMessage(R.string.RegistrationActivity_you_have_made_too_many_attempts_please_try_again_later) setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> - binding.callMeCountDown.visibility = View.VISIBLE - binding.resendSmsCountDown.visibility = View.VISIBLE - binding.wrongNumber.visibility = View.VISIBLE - binding.code.clear() - binding.keyboard.displayKeyboard() + fragmentViewModel.resetAllViews() } show() } @@ -210,11 +222,7 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c binding.keyboard.displayFailure().addListener(object : AssertedSuccessListener() { override fun onSuccess(result: Boolean?) { - binding.callMeCountDown.visibility = View.VISIBLE - binding.resendSmsCountDown.visibility = View.VISIBLE - binding.wrongNumber.visibility = View.VISIBLE - binding.code.clear() - binding.keyboard.displayKeyboard() + fragmentViewModel.resetAllViews() } }) } @@ -229,7 +237,7 @@ class EnterCodeFragment : LoggingFragment(R.layout.fragment_registration_enter_c setTitle(it) } setMessage(getString(R.string.RegistrationActivity_error_connecting_to_service)) - setPositiveButton(android.R.string.ok) { _, _ -> binding.keyboard.displayKeyboard() } + setPositiveButton(android.R.string.ok) { _, _ -> fragmentViewModel.showKeyboard() } show() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeState.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeState.kt new file mode 100644 index 0000000000..8c570d135b --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeState.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.registration.ui.entercode + +data class EnterCodeState(val resetRequiredAfterFailure: Boolean = false, val showKeyboard: Boolean = false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeViewModel.kt new file mode 100644 index 0000000000..a467b5b51f --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/entercode/EnterCodeViewModel.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.registration.ui.entercode + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.asLiveData +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.update + +class EnterCodeViewModel : ViewModel() { + private val store = MutableStateFlow(EnterCodeState()) + val uiState = store.asLiveData() + + fun resetAllViews() { + store.update { it.copy(resetRequiredAfterFailure = true) } + } + + fun allViewsResetCompleted() { + store.update { + it.copy( + resetRequiredAfterFailure = false, + showKeyboard = false + ) + } + } + + fun showKeyboard() { + store.update { it.copy(showKeyboard = true) } + } + + fun keyboardShown() { + store.update { it.copy(showKeyboard = false) } + } +}