From ebd8d85a3d154be4378960b1ed09ced4ee28ecc2 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 15 Feb 2024 15:23:40 -0500 Subject: [PATCH] Implement UX feedback in new conversation start flows. --- .../securesms/NewConversationActivity.java | 11 +++++++-- .../ui/creategroup/CreateGroupActivity.java | 5 ++-- .../recipients/ui/findby/FindByActivity.kt | 24 +++++++++++++++---- .../recipients/ui/findby/FindByViewModel.kt | 13 ++++++++-- .../main/res/drawable/ic_new_group_circle.xml | 14 ----------- app/src/main/res/drawable/symbol_group_24.xml | 23 +++++++++--------- ...ct_selection_find_by_phone_number_item.xml | 2 +- ...ontact_selection_find_by_username_item.xml | 2 +- .../contact_selection_new_group_item.xml | 10 +++++--- 9 files changed, 62 insertions(+), 42 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_new_group_circle.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 38cc30dabb..8f641702b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -80,6 +80,7 @@ public class NewConversationActivity extends ContactSelectionActivity private ContactsManagementViewModel viewModel; private ActivityResultLauncher contactLauncher; + private ActivityResultLauncher createGroupLauncher; private ActivityResultLauncher findByLauncher; private final LifecycleDisposable disposables = new LifecycleDisposable(); @@ -108,6 +109,12 @@ public class NewConversationActivity extends ContactSelectionActivity } }); + createGroupLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK) { + finish(); + } + }); + viewModel = new ViewModelProvider(this, factory).get(ContactsManagementViewModel.class); } @@ -220,7 +227,7 @@ public class NewConversationActivity extends ContactSelectionActivity } private void handleCreateGroup() { - startActivity(CreateGroupActivity.newIntent(this)); + createGroupLauncher.launch(CreateGroupActivity.newIntent(this)); } private void handleInvite() { @@ -245,7 +252,7 @@ public class NewConversationActivity extends ContactSelectionActivity @Override public void onNewGroup(boolean forceV1) { handleCreateGroup(); - finish(); +// finish(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index a88a359b84..37800e2d46 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -15,6 +15,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.signal.core.util.DimensionUnit; +import org.signal.core.util.Stopwatch; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.ContactSelectionActivity; @@ -22,7 +23,6 @@ import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; -import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.groups.ui.creategroup.details.AddGroupDetailsActivity; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; @@ -30,11 +30,9 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; import org.thoughtcrime.securesms.util.FeatureFlags; -import org.signal.core.util.Stopwatch; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -104,6 +102,7 @@ public class CreateGroupActivity extends ContactSelectionActivity implements Con @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == REQUEST_CODE_ADD_DETAILS && resultCode == RESULT_OK) { + setResult(RESULT_OK); finish(); } else { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt index 603b4e882c..817f1601bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt @@ -41,6 +41,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color @@ -347,7 +348,11 @@ private fun Content( .padding(horizontal = 16.dp, vertical = 10.dp) .focusRequester(focusRequester) .heightIn(min = 44.dp), - contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + contentPadding = if (state.mode == FindByMode.PHONE_NUMBER) { + TextFieldDefaults.contentPaddingWithoutLabel(start = 4.dp, top = 10.dp, bottom = 10.dp) + } else { + TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + } ) if (state.mode == FindByMode.USERNAME) { @@ -395,18 +400,27 @@ private fun PhoneNumberEntryPrefix( onSelectCountryPrefixClick: () -> Unit ) { Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(end = 16.dp) ) { Row( - modifier = Modifier.clickable(onClick = onSelectCountryPrefixClick, enabled = enabled) + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clip(RoundedCornerShape(1000.dp)) + .clickable(onClick = onSelectCountryPrefixClick, enabled = enabled) ) { Text( - text = selectedCountryPrefix.toString() + text = selectedCountryPrefix.toString(), + modifier = Modifier + .padding(start = 12.dp, top = 6.dp, bottom = 6.dp) ) Icon( painter = painterResource(id = R.drawable.symbol_dropdown_triangle_24), contentDescription = null, - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .size(24.dp) + .padding(end = 1.dp) ) } Dividers.Vertical( @@ -414,7 +428,7 @@ private fun PhoneNumberEntryPrefix( color = MaterialTheme.colorScheme.outline, modifier = Modifier .padding(vertical = 2.dp) - .padding(start = 8.dp) + .padding(start = 7.dp) .height(20.dp) ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt index 8ed177d703..8637b1910b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.profiles.manage.UsernameRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.util.CountryPrefix import org.thoughtcrime.securesms.util.UsernameUtil +import org.whispersystems.signalservice.api.util.PhoneNumberFormatter import java.util.concurrent.TimeUnit class FindByViewModel( @@ -104,12 +105,20 @@ class FindByViewModel( ContactDiscovery.refresh(context, recipient, false, TimeUnit.SECONDS.toMillis(10)) val resolved = Recipient.resolved(recipient.id) if (!resolved.isRegistered) { - FindByResult.NotFound(recipient.id) + if (PhoneNumberFormatter.isValidNumber(nationalNumber, countryCode.toString())) { + FindByResult.NotFound(recipient.id) + } else { + FindByResult.InvalidEntry + } } else { FindByResult.Success(recipient.id) } } catch (e: Exception) { - FindByResult.NotFound(recipient.id) + if (PhoneNumberFormatter.isValidNumber(nationalNumber, countryCode.toString())) { + FindByResult.NotFound(recipient.id) + } else { + FindByResult.InvalidEntry + } } } else { FindByResult.Success(recipient.id) diff --git a/app/src/main/res/drawable/ic_new_group_circle.xml b/app/src/main/res/drawable/ic_new_group_circle.xml deleted file mode 100644 index fde3317a5b..0000000000 --- a/app/src/main/res/drawable/ic_new_group_circle.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/symbol_group_24.xml b/app/src/main/res/drawable/symbol_group_24.xml index 9418b74976..5e4419695c 100644 --- a/app/src/main/res/drawable/symbol_group_24.xml +++ b/app/src/main/res/drawable/symbol_group_24.xml @@ -3,15 +3,16 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - - + + + + diff --git a/app/src/main/res/layout/contact_selection_find_by_phone_number_item.xml b/app/src/main/res/layout/contact_selection_find_by_phone_number_item.xml index 6c5e2a078d..1ec55382a9 100644 --- a/app/src/main/res/layout/contact_selection_find_by_phone_number_item.xml +++ b/app/src/main/res/layout/contact_selection_find_by_phone_number_item.xml @@ -22,7 +22,7 @@ app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Signal.Circle" app:srcCompat="@drawable/symbol_number_24" - app:tint="@color/signal_colorOnSurfaceVariant" /> + app:tint="@color/signal_colorOnSecondaryContainer" /> + app:tint="@color/signal_colorOnSecondaryContainer" /> - + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Signal.Circle" + app:tint="@color/signal_colorOnSecondaryContainer" />