diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index 2f4bf88465..6940262f8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -46,7 +46,8 @@ import static org.thoughtcrime.securesms.database.MentionUtil.MENTION_STARTER; public class ComposeText extends EmojiEditText { - private CharSequence combinedHint; + private CharSequence hint; + private SpannableString subHint; private MentionRendererDelegate mentionRendererDelegate; private MentionValidatorWatcher mentionValidatorWatcher; @@ -84,8 +85,14 @@ public class ComposeText extends EmojiEditText { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - if (!TextUtils.isEmpty(combinedHint)) { - setHint(combinedHint); + if (!TextUtils.isEmpty(hint)) { + if (!TextUtils.isEmpty(subHint)) { + setHint(new SpannableStringBuilder().append(ellipsizeToWidth(hint)) + .append("\n") + .append(ellipsizeToWidth(subHint))); + } else { + setHint(ellipsizeToWidth(hint)); + } } } @@ -143,18 +150,24 @@ public class ComposeText extends EmojiEditText { } public void setHint(@NonNull String hint, @Nullable CharSequence subHint) { - if (subHint != null) { - Spannable subHintSpannable = new SpannableString(subHint); - subHintSpannable.setSpan(new RelativeSizeSpan(0.5f), 0, subHintSpannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); + this.hint = hint; - combinedHint = new SpannableStringBuilder().append(ellipsizeToWidth(hint)) - .append("\n") - .append(ellipsizeToWidth(subHintSpannable)); + if (subHint != null) { + this.subHint = new SpannableString(subHint); + this.subHint.setSpan(new RelativeSizeSpan(0.5f), 0, subHint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); } else { - combinedHint = ellipsizeToWidth(hint); + this.subHint = null; } - super.setHint(combinedHint); + if (this.subHint != null) { + super.setHint(new SpannableStringBuilder().append(ellipsizeToWidth(this.hint)) + .append("\n") + .append(ellipsizeToWidth(this.subHint))); + } else { + super.setHint(ellipsizeToWidth(this.hint)); + } + + super.setHint(hint); } public void appendInvite(String invite) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index ed7281a67c..8ea5d57ab3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -1991,7 +1991,7 @@ public class ConversationActivity extends PassphraseRequiredActivity }); composeText.setMentionQueryChangedListener(query -> { - if (getRecipient().isPushV2Group()) { + if (getRecipient().isPushV2Group() && getRecipient().isActiveGroup()) { if (!mentionsSuggestions.resolved()) { mentionsSuggestions.get(); } @@ -2000,7 +2000,7 @@ public class ConversationActivity extends PassphraseRequiredActivity }); composeText.setMentionValidator(annotations -> { - if (!getRecipient().isPushV2Group()) { + if (!getRecipient().isPushV2Group() || !getRecipient().isActiveGroup()) { return annotations; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 714334c83b..df74b7ea90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -1521,7 +1521,7 @@ public class ConversationItem extends LinearLayout implements BindableConversati @Override public void onClick(@NonNull View widget) { - if (eventListener != null && !Recipient.resolved(mentionedRecipientId).isLocalNumber()) { + if (eventListener != null) { VibrateUtil.vibrateTick(context); eventListener.onGroupMemberClicked(mentionedRecipientId, conversationRecipient.get().requireGroupId()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java index 2d55bdbbd3..0467eee47d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java @@ -30,6 +30,7 @@ public class MentionsPickerFragment extends LoggingFragment { private View bottomDivider; private BottomSheetBehavior behavior; private MentionsPickerViewModel viewModel; + private Runnable lockSheetAfterListUpdate = () -> behavior.setHideable(false); @Override public @Nullable View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -62,6 +63,7 @@ public class MentionsPickerFragment extends LoggingFragment { } private void initializeBehavior() { + behavior.setHideable(true); behavior.setState(BottomSheetBehavior.STATE_HIDDEN); behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @@ -69,6 +71,7 @@ public class MentionsPickerFragment extends LoggingFragment { public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_HIDDEN) { adapter.submitList(Collections.emptyList()); + showDividers(false); } else { showDividers(true); } @@ -109,9 +112,10 @@ public class MentionsPickerFragment extends LoggingFragment { if (isShowing) { list.scrollToPosition(0); behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); - list.post(() -> behavior.setHideable(false)); + list.post(lockSheetAfterListUpdate); showDividers(true); } else { + list.getHandler().removeCallbacks(lockSheetAfterListUpdate); behavior.setHideable(true); behavior.setState(BottomSheetBehavior.STATE_HIDDEN); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java index 861f540536..8a50006db9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java @@ -38,8 +38,8 @@ public class MentionsPickerViewModel extends ViewModel { LiveData recipient = Transformations.switchMap(liveRecipient, LiveRecipient::getLiveData); LiveData> fullMembers = Transformations.distinctUntilChanged(LiveDataUtil.mapAsync(recipient, mentionsPickerRepository::getMembers)); - LiveData query = Transformations.distinctUntilChanged(liveQuery); - LiveData mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m)); + + LiveData mentionQuery = LiveDataUtil.combineLatest(liveQuery, fullMembers, (q, m) -> new MentionQuery(q.query, m)); this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).>map(MentionViewState::new).toList()); }