diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java index 0fab2e03b5..928522c4ad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java @@ -109,7 +109,7 @@ public class UsernameEditFragment extends LoggingFragment { binding.usernameSubmitButton.setOnClickListener(v -> promptOrSubmitUsername()); binding.usernameDeleteButton.setOnClickListener(v -> viewModel.onUsernameDeleted()); - binding.usernameDoneButton.setOnClickListener(v -> viewModel.onUsernameSubmitted()); + binding.usernameDoneButton.setOnClickListener(v -> viewModel.onUsernameSubmitted(false)); binding.usernameSkipButton.setOnClickListener(v -> viewModel.onUsernameSkipped()); binding.usernameText.addTextChangedListener(new SimpleTextWatcher() { @@ -156,13 +156,13 @@ public class UsernameEditFragment extends LoggingFragment { new MaterialAlertDialogBuilder(requireContext()) .setMessage(R.string.UsernameEditFragment_recovery_dialog_confirmation) .setPositiveButton(android.R.string.ok, ((dialog, which) -> { - viewModel.onUsernameSubmitted(); + viewModel.onUsernameSubmitted(true); dialog.dismiss(); })) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .show(); } else { - viewModel.onUsernameSubmitted(); + viewModel.onUsernameSubmitted(false); } } @@ -356,6 +356,12 @@ public class UsernameEditFragment extends LoggingFragment { case SKIPPED: closeScreen(); break; + case NEEDS_CONFIRM_RESET: + new MaterialAlertDialogBuilder(requireContext()) + .setMessage(R.string.UsernameEditFragment_change_confirmation_message) + .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) + .setPositiveButton(R.string.UsernameEditFragment_continue, (dialog, which) -> viewModel.onUsernameSubmitted(true)) + .show(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt index 7af746d415..efb8c24741 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt @@ -12,6 +12,7 @@ import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.PublishSubject import org.signal.core.util.Result +import org.signal.core.util.isNotNullOrBlank import org.signal.core.util.logging.Log import org.signal.libsignal.usernames.Username import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -128,7 +129,10 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern events.onNext(Event.SKIPPED) } - fun onUsernameSubmitted() { + /** + * @param userConfirmedResetOk True if the user is submitting this after confirming that they're ok with resetting their username via [Event.NEEDS_CONFIRM_RESET]. + */ + fun onUsernameSubmitted(userConfirmedResetOk: Boolean) { if (!NetworkUtil.isConnected(ApplicationDependencies.getApplication())) { events.onNext(Event.NETWORK_FAILURE) return @@ -138,6 +142,11 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern val usernameState = uiState.state.usernameState val isCaseChange = isCaseChange(editState) + if (!isCaseChange && SignalStore.account().username.isNotNullOrBlank() && !userConfirmedResetOk) { + events.onNext(Event.NEEDS_CONFIRM_RESET) + return + } + if (usernameState !is UsernameState.Reserved && usernameState !is UsernameState.CaseChange) { Log.w(TAG, "Username was submitted, current state is invalid! State: ${usernameState.javaClass.simpleName}") uiState.update { it.copy(buttonState = ButtonState.SUBMIT_DISABLED, usernameStatus = UsernameStatus.NONE) } @@ -365,7 +374,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern } enum class Event { - NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED + NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED, NEEDS_CONFIRM_RESET } class Factory(private val mode: UsernameEditMode) : ViewModelProvider.Factory { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f3f2dc273..a1110b09ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2320,6 +2320,10 @@ This number can\'t start with 00. Enter a digit between 1–9 Recovering your username will reset your existing QR code and link. Are you sure? + + Changing your username will reset your existing QR code and link. Are you sure? + + Continue %d contact is on Signal!