From c96fec953730378a0beb3fd09079bbf51672781c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 15 Sep 2022 10:18:40 -0300 Subject: [PATCH] Update username to use . as delimiter. --- .../profiles/manage/UsernameEditFragmentTest.kt | 5 ++++- .../securesms/contacts/ContactSelectionListItem.java | 5 +++-- .../securesms/profiles/manage/UsernameEditFragment.java | 9 +++++++++ .../securesms/profiles/manage/UsernameEditViewModel.java | 2 +- .../securesms/profiles/manage/UsernameState.kt | 8 ++++++-- .../org/thoughtcrime/securesms/util/FeatureFlags.java | 1 + app/src/main/res/layout/username_edit_fragment.xml | 3 ++- 7 files changed, 26 insertions(+), 7 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt index be7c6deb59..012f5b0719 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt @@ -93,10 +93,11 @@ class UsernameEditFragmentTest { fun testNicknameUpdateHappyPath() { val nickname = "Spiderman" val discriminator = "4578" + val username = "$nickname${UsernameState.DELIMITER}$discriminator" InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Put("/v1/accounts/username/reserved") { - MockResponse().success(ReserveUsernameResponse("$nickname#$discriminator", "reservationToken")) + MockResponse().success(ReserveUsernameResponse(username, "reservationToken")) }, Put("/v1/accounts/username/confirm") { MockResponse().success() @@ -119,6 +120,8 @@ class UsernameEditFragmentTest { onView(withId(R.id.username_text)).perform(closeSoftKeyboard()) onView(withId(R.id.username_done_button)).check(matches(isDisplayed())) onView(withId(R.id.username_done_button)).check(matches(isEnabled())) + onView(withText(username)).check(matches(isDisplayed())) + onView(withId(R.id.username_done_button)).perform(click()) computationScheduler.triggerActions() diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java index 8c92d18c3d..53b8d0524e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; import org.thoughtcrime.securesms.conversation.colors.AvatarColor; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; +import org.thoughtcrime.securesms.profiles.manage.UsernameState; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; @@ -241,10 +242,10 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi } private CharSequence presentUsername(@NonNull String username) { - if (username.contains("#")) { + if (username.contains(UsernameState.DELIMITER)) { return username; } else { - return new SpannableStringBuilder(username).append(SpanUtil.color(ContextCompat.getColor(getContext(), R.color.signal_colorOutline), "#")); + return new SpannableStringBuilder(username).append(SpanUtil.color(ContextCompat.getColor(getContext(), R.color.signal_colorOutline), UsernameState.DELIMITER)); } } 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 43f7fdf94d..11d4d5859e 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 @@ -168,6 +168,7 @@ public class UsernameEditFragment extends LoggingFragment { presentSuffix(state.getUsername()); presentButtonState(state.getButtonState()); + presentSummary(state.getUsername()); switch (state.getUsernameStatus()) { case NONE: @@ -210,6 +211,14 @@ public class UsernameEditFragment extends LoggingFragment { } } + private void presentSummary(@NonNull UsernameState usernameState) { + if (usernameState.getUsername() != null) { + binding.summary.setText(usernameState.getUsername()); + } else { + binding.summary.setText(R.string.UsernameEditFragment__choose_your_username); + } + } + private void presentRegistrationButtonState(@NonNull UsernameEditViewModel.ButtonState buttonState) { binding.usernameText.setEnabled(true); binding.usernameProgressCard.setVisibility(View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java index 12a4adb51d..ef3b6afec4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.java @@ -261,7 +261,7 @@ class UsernameEditViewModel extends ViewModel { NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED } - static class Factory extends ViewModelProvider.NewInstanceFactory { + static class Factory implements ViewModelProvider.Factory { private final boolean isInRegistration; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameState.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameState.kt index 2fe50608c6..1a0c3e3b46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameState.kt @@ -27,10 +27,14 @@ sealed class UsernameState { ) : UsernameState() fun getNickname(): String? { - return username?.split('#')?.firstOrNull() + return username?.split(DELIMITER)?.firstOrNull() } fun getDiscriminator(): String? { - return username?.split('#')?.lastOrNull() + return username?.split(DELIMITER)?.lastOrNull() + } + + companion object { + const val DELIMITER = "." } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index 1977b6767b..357595e24e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -178,6 +178,7 @@ public final class FeatureFlags { @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") @VisibleForTesting static final Map FORCED_VALUES = new HashMap() {{ + put(USERNAMES, true); }}; /** diff --git a/app/src/main/res/layout/username_edit_fragment.xml b/app/src/main/res/layout/username_edit_fragment.xml index 3786ac97cc..bf154942e3 100644 --- a/app/src/main/res/layout/username_edit_fragment.xml +++ b/app/src/main/res/layout/username_edit_fragment.xml @@ -31,7 +31,8 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbar" - app:srcCompat="@drawable/ic_at_24" /> + app:srcCompat="@drawable/ic_at_24" + app:tint="@color/signal_colorOnSurface" />