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!