Implement UX feedback in new conversation start flows.

This commit is contained in:
Cody Henthorne
2024-02-15 15:23:40 -05:00
parent 3f8a9e1be2
commit ebd8d85a3d
9 changed files with 62 additions and 42 deletions

View File

@@ -80,6 +80,7 @@ public class NewConversationActivity extends ContactSelectionActivity
private ContactsManagementViewModel viewModel;
private ActivityResultLauncher<Intent> contactLauncher;
private ActivityResultLauncher<Intent> createGroupLauncher;
private ActivityResultLauncher<FindByMode> 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

View File

@@ -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);

View File

@@ -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)
)
}

View File

@@ -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)