Do not send to blocked recipients.

This commit is contained in:
clauz9 2022-02-25 21:23:58 +02:00 committed by Alex Hart
parent 4b07da4978
commit eb12395b8e
13 changed files with 45 additions and 12 deletions

View file

@ -312,26 +312,26 @@ data class CallParticipantsState(
@PluralsRes multipleParticipants: Int,
members: List<GroupMemberEntry.FullMember>
): String {
val membersWithoutYou: List<GroupMemberEntry.FullMember> = members.filterNot { it.member.isSelf }
val eligibleMembers: List<GroupMemberEntry.FullMember> = members.filterNot { it.member.isSelf || it.member.isBlocked }
return when (membersWithoutYou.size) {
return when (eligibleMembers.size) {
0 -> ""
1 -> context.getString(
oneParticipant,
membersWithoutYou[0].member.getShortDisplayName(context)
eligibleMembers[0].member.getShortDisplayName(context)
)
2 -> context.getString(
twoParticipants,
membersWithoutYou[0].member.getShortDisplayName(context),
membersWithoutYou[1].member.getShortDisplayName(context)
eligibleMembers[0].member.getShortDisplayName(context),
eligibleMembers[1].member.getShortDisplayName(context)
)
else -> {
val others = membersWithoutYou.size - 2
val others = eligibleMembers.size - 2
context.resources.getQuantityString(
multipleParticipants,
others,
membersWithoutYou[0].member.getShortDisplayName(context),
membersWithoutYou[1].member.getShortDisplayName(context),
eligibleMembers[0].member.getShortDisplayName(context),
eligibleMembers[1].member.getShortDisplayName(context),
others
)
}

View file

@ -34,6 +34,7 @@ public class GroupReceiptDatabase extends Database {
public static final int STATUS_DELIVERED = 1;
public static final int STATUS_READ = 2;
public static final int STATUS_VIEWED = 3;
public static final int STATUS_SKIPPED = 4;
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY, " +
MMS_ID + " INTEGER, " + RECIPIENT_ID + " INTEGER, " + STATUS + " INTEGER, " + TIMESTAMP + " INTEGER, " + UNIDENTIFIED + " INTEGER DEFAULT 0);";
@ -95,6 +96,26 @@ public class GroupReceiptDatabase extends Database {
}
}
public void setSkipped(Collection<RecipientId> recipients, long mmsId) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.beginTransaction();
try {
String query = MMS_ID + " = ? AND " + RECIPIENT_ID + " = ?";
for (RecipientId recipient : recipients) {
ContentValues values = new ContentValues(1);
values.put(STATUS, STATUS_SKIPPED);
db.update(TABLE_NAME, values, query, new String[]{ String.valueOf(mmsId), recipient.serialize()});
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
public @NonNull List<GroupReceiptInfo> getGroupReceiptInfo(long mmsId) {
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
List<GroupReceiptInfo> results = new LinkedList<>();

View file

@ -58,7 +58,6 @@ public class GroupCallUpdateSendJob extends BaseJob {
List<RecipientId> recipients = Stream.of(RecipientUtil.getEligibleForSending(conversationRecipient.getParticipants()))
.filterNot(Recipient::isSelf)
.filterNot(Recipient::isBlocked)
.map(Recipient::getId)
.toList();

View file

@ -187,6 +187,9 @@ public class RemoteDeleteSendJob extends BaseJob {
new MessageId(messageId, isMms),
dataMessage);
List<RecipientId> blockedIds = Stream.of(conversationRecipient.getParticipants()).filter(Recipient::isBlocked).map(Recipient::getId).toList();
SignalDatabase.groupReceipts().setSkipped(blockedIds, messageId);
return GroupSendJobHelper.getCompletedSends(destinations, results);
}

View file

@ -122,7 +122,6 @@ public class TypingSendJob extends BaseJob {
recipients = RecipientUtil.getEligibleForSending(Stream.of(recipients)
.map(Recipient::resolve)
.filter(r -> !r.isBlocked())
.toList());
SignalServiceTypingMessage typingMessage = new SignalServiceTypingMessage(typing ? Action.STARTED : Action.STOPPED, System.currentTimeMillis(), groupId);

View file

@ -25,6 +25,7 @@ final class MessageDetails {
private final Collection<RecipientDeliveryStatus> read;
private final Collection<RecipientDeliveryStatus> notSent;
private final Collection<RecipientDeliveryStatus> viewed;
private final Collection<RecipientDeliveryStatus> skipped;
MessageDetails(@NonNull ConversationMessage conversationMessage, @NonNull List<RecipientDeliveryStatus> recipients) {
this.conversationMessage = conversationMessage;
@ -35,6 +36,7 @@ final class MessageDetails {
read = new TreeSet<>(RECIPIENT_COMPARATOR);
notSent = new TreeSet<>(RECIPIENT_COMPARATOR);
viewed = new TreeSet<>(RECIPIENT_COMPARATOR);
skipped = new TreeSet<>(RECIPIENT_COMPARATOR);
if (conversationMessage.getMessageRecord().getRecipient().isSelf()) {
read.addAll(recipients);
@ -58,6 +60,9 @@ final class MessageDetails {
break;
case VIEWED:
viewed.add(status);
break;
case SKIPPED:
skipped.add(status);
}
}
} else {
@ -77,6 +82,8 @@ final class MessageDetails {
return sent;
}
@NonNull Collection<RecipientDeliveryStatus> getSkipped() {return skipped;}
@NonNull Collection<RecipientDeliveryStatus> getDelivered() {
return delivered;
}

View file

@ -138,6 +138,7 @@ public final class MessageDetailsFragment extends FullScreenDialogFragment {
addRecipients(list, RecipientHeader.DELIVERED, details.getDelivered());
addRecipients(list, RecipientHeader.SENT_TO, details.getSent());
addRecipients(list, RecipientHeader.PENDING, details.getPending());
addRecipients(list, RecipientHeader.SKIPPED, details.getSkipped());
} else {
addRecipients(list, RecipientHeader.SENT_FROM, details.getSent());
}

View file

@ -132,6 +132,7 @@ final class MessageDetailsRepository {
else if (groupStatus == GroupReceiptDatabase.STATUS_UNDELIVERED) return RecipientDeliveryStatus.Status.PENDING;
else if (groupStatus == GroupReceiptDatabase.STATUS_UNKNOWN) return RecipientDeliveryStatus.Status.UNKNOWN;
else if (groupStatus == GroupReceiptDatabase.STATUS_VIEWED) return RecipientDeliveryStatus.Status.VIEWED;
else if (groupStatus == GroupReceiptDatabase.STATUS_SKIPPED) return RecipientDeliveryStatus.Status.SKIPPED;
throw new AssertionError();
}
}

View file

@ -11,7 +11,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
final class RecipientDeliveryStatus {
enum Status {
UNKNOWN, PENDING, SENT, DELIVERED, READ, VIEWED
UNKNOWN, PENDING, SENT, DELIVERED, READ, VIEWED, SKIPPED,
}
private final MessageRecord messageRecord;

View file

@ -11,6 +11,7 @@ enum RecipientHeader {
DELIVERED(R.string.message_details_recipient_header__delivered_to),
READ(R.string.message_details_recipient_header__read_by),
NOT_SENT(R.string.message_details_recipient_header__not_sent),
SKIPPED(R.string.message_details_recipient_header__skipped),
VIEWED(R.string.message_details_recipient_header__viewed);
private final int headerText;

View file

@ -117,6 +117,7 @@ public class RecipientUtil {
public static List<Recipient> getEligibleForSending(@NonNull List<Recipient> recipients) {
return Stream.of(recipients)
.filter(r -> r.getRegistered() != RegisteredState.NOT_REGISTERED)
.filter(r -> !r.isBlocked())
.toList();
}

View file

@ -648,7 +648,6 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
recipients = RecipientUtil.getEligibleForSending((recipients.stream()
.map(Recipient::resolve)
.filter(r -> !r.isBlocked())
.collect(Collectors.toList())));
OpaqueMessage opaqueMessage = new OpaqueMessage(message, getUrgencyFromCallUrgency(urgency));

View file

@ -2304,6 +2304,7 @@
<string name="message_details_recipient_header__read_by">Read by</string>
<string name="message_details_recipient_header__not_sent">Not sent</string>
<string name="message_details_recipient_header__viewed">Viewed by</string>
<string name="message_details_recipient_header__skipped">Skipped</string>
<!-- message_Details_recipient -->
<string name="message_details_recipient__failed_to_send">Failed to send</string>