Add support for Group V2 description field.

This commit is contained in:
Cody Henthorne
2021-05-07 13:43:31 -04:00
committed by Greyson Parrelli
parent b3aec58e69
commit 8c9df8d3be
56 changed files with 892 additions and 117 deletions

View File

@@ -5,6 +5,7 @@ import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.graphics.drawable.LayerDrawable;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
@@ -87,6 +88,7 @@ public class ConversationBannerView extends ConstraintLayout {
public void setDescription(@Nullable CharSequence description) {
contactDescription.setText(description);
contactDescription.setVisibility(TextUtils.isEmpty(description) ? GONE : VISIBLE);
}
public void showBackgroundBubble(boolean enabled) {
@@ -109,6 +111,10 @@ public class ConversationBannerView extends ConstraintLayout {
contactDescription.setVisibility(View.GONE);
}
public void setLinkifyDescription(boolean enable) {
contactDescription.setMovementMethod(enable ? LinkMovementMethod.getInstance() : null);
}
private static final class FallbackPhotoProvider extends Recipient.FallbackPhotoProvider {
@Override
public @NonNull FallbackContactPhoto getPhotoForRecipientWithoutName() {

View File

@@ -107,7 +107,9 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionRecycler;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.groups.ui.invitesandrequests.invite.GroupLinkInviteFriendsBottomSheetDialogFragment;
import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupDescriptionDialog;
import org.thoughtcrime.securesms.groups.ui.migration.GroupsV1MigrationInfoBottomSheetDialogFragment;
import org.thoughtcrime.securesms.groups.v2.GroupDescriptionUtil;
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
import org.thoughtcrime.securesms.jobs.MultiDeviceViewOnceOpenJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
@@ -492,7 +494,7 @@ public class ConversationFragment extends LoggingFragment {
});
}
private static void presentMessageRequestProfileView(@NonNull Context context, @NonNull MessageRequestViewModel.RecipientInfo recipientInfo, @Nullable ConversationBannerView conversationBanner) {
private void presentMessageRequestProfileView(@NonNull Context context, @NonNull MessageRequestViewModel.RecipientInfo recipientInfo, @Nullable ConversationBannerView conversationBanner) {
if (conversationBanner == null) {
return;
}
@@ -536,7 +538,20 @@ public class ConversationFragment extends LoggingFragment {
}
if (groups.isEmpty() || isSelf) {
conversationBanner.hideDescription();
if (TextUtils.isEmpty(recipientInfo.getGroupDescription())) {
conversationBanner.setLinkifyDescription(false);
conversationBanner.hideDescription();
} else {
conversationBanner.setLinkifyDescription(true);
boolean linkifyWebLinks = recipientInfo.getMessageRequestState() == MessageRequestState.NONE;
conversationBanner.setDescription(GroupDescriptionUtil.style(context,
recipientInfo.getGroupDescription(),
linkifyWebLinks,
() -> GroupDescriptionDialog.show(getChildFragmentManager(),
recipient.getDisplayName(context),
recipientInfo.getGroupDescription(),
linkifyWebLinks)));
}
} else {
final String description;
@@ -1630,6 +1645,13 @@ public class ConversationFragment extends LoggingFragment {
.show();
}
}
@Override
public void onViewGroupDescriptionChange(@Nullable GroupId groupId, @NonNull String description, boolean isMessageRequestAccepted) {
if (groupId != null) {
GroupDescriptionDialog.show(getChildFragmentManager(), groupId, description, isMessageRequestAccepted);
}
}
}
public void refreshList() {

View File

@@ -67,6 +67,7 @@ public final class ConversationUpdateItem extends FrameLayout
private Recipient conversationRecipient;
private Optional<MessageRecord> nextMessageRecord;
private MessageRecord messageRecord;
private boolean isMessageRequestAccepted;
private LiveData<SpannableString> displayBody;
private EventListener eventListener;
@@ -112,7 +113,7 @@ public final class ConversationUpdateItem extends FrameLayout
{
this.batchSelected = batchSelected;
bind(lifecycleOwner, conversationMessage, previousMessageRecord, nextMessageRecord, conversationRecipient, hasWallpaper);
bind(lifecycleOwner, conversationMessage, previousMessageRecord, nextMessageRecord, conversationRecipient, hasWallpaper, isMessageRequestAccepted);
}
@Override
@@ -130,12 +131,14 @@ public final class ConversationUpdateItem extends FrameLayout
@NonNull Optional<MessageRecord> previousMessageRecord,
@NonNull Optional<MessageRecord> nextMessageRecord,
@NonNull Recipient conversationRecipient,
boolean hasWallpaper)
boolean hasWallpaper,
boolean isMessageRequestAccepted)
{
this.conversationMessage = conversationMessage;
this.messageRecord = conversationMessage.getMessageRecord();
this.nextMessageRecord = nextMessageRecord;
this.conversationRecipient = conversationRecipient;
this.conversationMessage = conversationMessage;
this.messageRecord = conversationMessage.getMessageRecord();
this.nextMessageRecord = nextMessageRecord;
this.conversationRecipient = conversationRecipient;
this.isMessageRequestAccepted = isMessageRequestAccepted;
senderObserver.observe(lifecycleOwner, messageRecord.getIndividualRecipient());
@@ -164,7 +167,7 @@ public final class ConversationUpdateItem extends FrameLayout
observeDisplayBody(lifecycleOwner, spannableMessage);
present(conversationMessage, nextMessageRecord, conversationRecipient);
present(conversationMessage, nextMessageRecord, conversationRecipient, isMessageRequestAccepted);
presentBackground(shouldCollapse(messageRecord, previousMessageRecord),
shouldCollapse(messageRecord, nextMessageRecord),
@@ -265,7 +268,8 @@ public final class ConversationUpdateItem extends FrameLayout
private void present(@NonNull ConversationMessage conversationMessage,
@NonNull Optional<MessageRecord> nextMessageRecord,
@NonNull Recipient conversationRecipient)
@NonNull Recipient conversationRecipient,
boolean isMessageRequestAccepted)
{
if (batchSelected.contains(conversationMessage)) setSelected(true);
else setSelected(false);
@@ -350,6 +354,14 @@ public final class ConversationUpdateItem extends FrameLayout
eventListener.onInMemoryMessageClicked(inMemoryMessageRecord);
}
});
} else if (conversationMessage.getMessageRecord().isGroupV2DescriptionUpdate()) {
actionButton.setVisibility(VISIBLE);
actionButton.setText(R.string.ConversationUpdateItem_view);
actionButton.setOnClickListener(v -> {
if (eventListener != null) {
eventListener.onViewGroupDescriptionChange(conversationRecipient.getGroupId().orNull(), conversationMessage.getMessageRecord().getGroupV2DescriptionUpdate(), isMessageRequestAccepted);
}
});
} else {
actionButton.setVisibility(GONE);
actionButton.setOnClickListener(null);
@@ -439,7 +451,7 @@ public final class ConversationUpdateItem extends FrameLayout
public void onChanged(Recipient recipient) {
if (recipient.getId() == conversationRecipient.getId() && (conversationRecipient == null || !conversationRecipient.hasSameContent(recipient))) {
conversationRecipient = recipient;
present(conversationMessage, nextMessageRecord, conversationRecipient);
present(conversationMessage, nextMessageRecord, conversationRecipient, isMessageRequestAccepted);
}
}
}