Do not send to blocked recipients.
This commit is contained in:
parent
4b07da4978
commit
eb12395b8e
13 changed files with 45 additions and 12 deletions
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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<>();
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue