mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-08 09:18:39 +01:00
Do not send to blocked recipients.
This commit is contained in:
+8
-8
@@ -312,26 +312,26 @@ data class CallParticipantsState(
|
|||||||
@PluralsRes multipleParticipants: Int,
|
@PluralsRes multipleParticipants: Int,
|
||||||
members: List<GroupMemberEntry.FullMember>
|
members: List<GroupMemberEntry.FullMember>
|
||||||
): String {
|
): 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 -> ""
|
0 -> ""
|
||||||
1 -> context.getString(
|
1 -> context.getString(
|
||||||
oneParticipant,
|
oneParticipant,
|
||||||
membersWithoutYou[0].member.getShortDisplayName(context)
|
eligibleMembers[0].member.getShortDisplayName(context)
|
||||||
)
|
)
|
||||||
2 -> context.getString(
|
2 -> context.getString(
|
||||||
twoParticipants,
|
twoParticipants,
|
||||||
membersWithoutYou[0].member.getShortDisplayName(context),
|
eligibleMembers[0].member.getShortDisplayName(context),
|
||||||
membersWithoutYou[1].member.getShortDisplayName(context)
|
eligibleMembers[1].member.getShortDisplayName(context)
|
||||||
)
|
)
|
||||||
else -> {
|
else -> {
|
||||||
val others = membersWithoutYou.size - 2
|
val others = eligibleMembers.size - 2
|
||||||
context.resources.getQuantityString(
|
context.resources.getQuantityString(
|
||||||
multipleParticipants,
|
multipleParticipants,
|
||||||
others,
|
others,
|
||||||
membersWithoutYou[0].member.getShortDisplayName(context),
|
eligibleMembers[0].member.getShortDisplayName(context),
|
||||||
membersWithoutYou[1].member.getShortDisplayName(context),
|
eligibleMembers[1].member.getShortDisplayName(context),
|
||||||
others
|
others
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class GroupReceiptDatabase extends Database {
|
|||||||
public static final int STATUS_DELIVERED = 1;
|
public static final int STATUS_DELIVERED = 1;
|
||||||
public static final int STATUS_READ = 2;
|
public static final int STATUS_READ = 2;
|
||||||
public static final int STATUS_VIEWED = 3;
|
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, " +
|
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);";
|
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) {
|
public @NonNull List<GroupReceiptInfo> getGroupReceiptInfo(long mmsId) {
|
||||||
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
|
||||||
List<GroupReceiptInfo> results = new LinkedList<>();
|
List<GroupReceiptInfo> results = new LinkedList<>();
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ public class GroupCallUpdateSendJob extends BaseJob {
|
|||||||
|
|
||||||
List<RecipientId> recipients = Stream.of(RecipientUtil.getEligibleForSending(conversationRecipient.getParticipants()))
|
List<RecipientId> recipients = Stream.of(RecipientUtil.getEligibleForSending(conversationRecipient.getParticipants()))
|
||||||
.filterNot(Recipient::isSelf)
|
.filterNot(Recipient::isSelf)
|
||||||
.filterNot(Recipient::isBlocked)
|
|
||||||
.map(Recipient::getId)
|
.map(Recipient::getId)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
|||||||
@@ -187,6 +187,9 @@ public class RemoteDeleteSendJob extends BaseJob {
|
|||||||
new MessageId(messageId, isMms),
|
new MessageId(messageId, isMms),
|
||||||
dataMessage);
|
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);
|
return GroupSendJobHelper.getCompletedSends(destinations, results);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,6 @@ public class TypingSendJob extends BaseJob {
|
|||||||
|
|
||||||
recipients = RecipientUtil.getEligibleForSending(Stream.of(recipients)
|
recipients = RecipientUtil.getEligibleForSending(Stream.of(recipients)
|
||||||
.map(Recipient::resolve)
|
.map(Recipient::resolve)
|
||||||
.filter(r -> !r.isBlocked())
|
|
||||||
.toList());
|
.toList());
|
||||||
|
|
||||||
SignalServiceTypingMessage typingMessage = new SignalServiceTypingMessage(typing ? Action.STARTED : Action.STOPPED, System.currentTimeMillis(), groupId);
|
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> read;
|
||||||
private final Collection<RecipientDeliveryStatus> notSent;
|
private final Collection<RecipientDeliveryStatus> notSent;
|
||||||
private final Collection<RecipientDeliveryStatus> viewed;
|
private final Collection<RecipientDeliveryStatus> viewed;
|
||||||
|
private final Collection<RecipientDeliveryStatus> skipped;
|
||||||
|
|
||||||
MessageDetails(@NonNull ConversationMessage conversationMessage, @NonNull List<RecipientDeliveryStatus> recipients) {
|
MessageDetails(@NonNull ConversationMessage conversationMessage, @NonNull List<RecipientDeliveryStatus> recipients) {
|
||||||
this.conversationMessage = conversationMessage;
|
this.conversationMessage = conversationMessage;
|
||||||
@@ -35,6 +36,7 @@ final class MessageDetails {
|
|||||||
read = new TreeSet<>(RECIPIENT_COMPARATOR);
|
read = new TreeSet<>(RECIPIENT_COMPARATOR);
|
||||||
notSent = new TreeSet<>(RECIPIENT_COMPARATOR);
|
notSent = new TreeSet<>(RECIPIENT_COMPARATOR);
|
||||||
viewed = new TreeSet<>(RECIPIENT_COMPARATOR);
|
viewed = new TreeSet<>(RECIPIENT_COMPARATOR);
|
||||||
|
skipped = new TreeSet<>(RECIPIENT_COMPARATOR);
|
||||||
|
|
||||||
if (conversationMessage.getMessageRecord().getRecipient().isSelf()) {
|
if (conversationMessage.getMessageRecord().getRecipient().isSelf()) {
|
||||||
read.addAll(recipients);
|
read.addAll(recipients);
|
||||||
@@ -58,6 +60,9 @@ final class MessageDetails {
|
|||||||
break;
|
break;
|
||||||
case VIEWED:
|
case VIEWED:
|
||||||
viewed.add(status);
|
viewed.add(status);
|
||||||
|
break;
|
||||||
|
case SKIPPED:
|
||||||
|
skipped.add(status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -77,6 +82,8 @@ final class MessageDetails {
|
|||||||
return sent;
|
return sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull Collection<RecipientDeliveryStatus> getSkipped() {return skipped;}
|
||||||
|
|
||||||
@NonNull Collection<RecipientDeliveryStatus> getDelivered() {
|
@NonNull Collection<RecipientDeliveryStatus> getDelivered() {
|
||||||
return delivered;
|
return delivered;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -138,6 +138,7 @@ public final class MessageDetailsFragment extends FullScreenDialogFragment {
|
|||||||
addRecipients(list, RecipientHeader.DELIVERED, details.getDelivered());
|
addRecipients(list, RecipientHeader.DELIVERED, details.getDelivered());
|
||||||
addRecipients(list, RecipientHeader.SENT_TO, details.getSent());
|
addRecipients(list, RecipientHeader.SENT_TO, details.getSent());
|
||||||
addRecipients(list, RecipientHeader.PENDING, details.getPending());
|
addRecipients(list, RecipientHeader.PENDING, details.getPending());
|
||||||
|
addRecipients(list, RecipientHeader.SKIPPED, details.getSkipped());
|
||||||
} else {
|
} else {
|
||||||
addRecipients(list, RecipientHeader.SENT_FROM, details.getSent());
|
addRecipients(list, RecipientHeader.SENT_FROM, details.getSent());
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -132,6 +132,7 @@ final class MessageDetailsRepository {
|
|||||||
else if (groupStatus == GroupReceiptDatabase.STATUS_UNDELIVERED) return RecipientDeliveryStatus.Status.PENDING;
|
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_UNKNOWN) return RecipientDeliveryStatus.Status.UNKNOWN;
|
||||||
else if (groupStatus == GroupReceiptDatabase.STATUS_VIEWED) return RecipientDeliveryStatus.Status.VIEWED;
|
else if (groupStatus == GroupReceiptDatabase.STATUS_VIEWED) return RecipientDeliveryStatus.Status.VIEWED;
|
||||||
|
else if (groupStatus == GroupReceiptDatabase.STATUS_SKIPPED) return RecipientDeliveryStatus.Status.SKIPPED;
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
|||||||
final class RecipientDeliveryStatus {
|
final class RecipientDeliveryStatus {
|
||||||
|
|
||||||
enum Status {
|
enum Status {
|
||||||
UNKNOWN, PENDING, SENT, DELIVERED, READ, VIEWED
|
UNKNOWN, PENDING, SENT, DELIVERED, READ, VIEWED, SKIPPED,
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MessageRecord messageRecord;
|
private final MessageRecord messageRecord;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ enum RecipientHeader {
|
|||||||
DELIVERED(R.string.message_details_recipient_header__delivered_to),
|
DELIVERED(R.string.message_details_recipient_header__delivered_to),
|
||||||
READ(R.string.message_details_recipient_header__read_by),
|
READ(R.string.message_details_recipient_header__read_by),
|
||||||
NOT_SENT(R.string.message_details_recipient_header__not_sent),
|
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);
|
VIEWED(R.string.message_details_recipient_header__viewed);
|
||||||
|
|
||||||
private final int headerText;
|
private final int headerText;
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ public class RecipientUtil {
|
|||||||
public static List<Recipient> getEligibleForSending(@NonNull List<Recipient> recipients) {
|
public static List<Recipient> getEligibleForSending(@NonNull List<Recipient> recipients) {
|
||||||
return Stream.of(recipients)
|
return Stream.of(recipients)
|
||||||
.filter(r -> r.getRegistered() != RegisteredState.NOT_REGISTERED)
|
.filter(r -> r.getRegistered() != RegisteredState.NOT_REGISTERED)
|
||||||
|
.filter(r -> !r.isBlocked())
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -648,7 +648,6 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
|
|||||||
|
|
||||||
recipients = RecipientUtil.getEligibleForSending((recipients.stream()
|
recipients = RecipientUtil.getEligibleForSending((recipients.stream()
|
||||||
.map(Recipient::resolve)
|
.map(Recipient::resolve)
|
||||||
.filter(r -> !r.isBlocked())
|
|
||||||
.collect(Collectors.toList())));
|
.collect(Collectors.toList())));
|
||||||
|
|
||||||
OpaqueMessage opaqueMessage = new OpaqueMessage(message, getUrgencyFromCallUrgency(urgency));
|
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__read_by">Read by</string>
|
||||||
<string name="message_details_recipient_header__not_sent">Not sent</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__viewed">Viewed by</string>
|
||||||
|
<string name="message_details_recipient_header__skipped">Skipped</string>
|
||||||
|
|
||||||
<!-- message_Details_recipient -->
|
<!-- message_Details_recipient -->
|
||||||
<string name="message_details_recipient__failed_to_send">Failed to send</string>
|
<string name="message_details_recipient__failed_to_send">Failed to send</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user