Improved missed call state handling.

This commit is contained in:
Alex Hart
2024-04-25 10:18:01 -03:00
committed by Greyson Parrelli
parent 95fbd7a31c
commit e60b32202e
10 changed files with 128 additions and 10 deletions

View File

@@ -12,16 +12,17 @@ import com.annimon.stream.Stream;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.CallTable;
import org.thoughtcrime.securesms.database.MessageTable.ExpirationInfo;
import org.thoughtcrime.securesms.database.MessageTable.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.MessageTable.SyncMessageId;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobs.CallLogEventSendJob;
import org.thoughtcrime.securesms.jobs.MultiDeviceReadUpdateJob;
import org.thoughtcrime.securesms.jobs.SendReadReceiptJob;
import org.thoughtcrime.securesms.notifications.v2.ConversationId;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.service.ExpiringMessageManager;
import java.util.ArrayList;
import java.util.LinkedList;
@@ -62,6 +63,7 @@ public class MarkReadReceiver extends BroadcastReceiver {
}
process(messageIdsCollection);
processCallEvents(threads, System.currentTimeMillis());
ApplicationDependencies.getMessageNotifier().updateNotification(context);
finisher.finish();
@@ -102,6 +104,20 @@ public class MarkReadReceiver extends BroadcastReceiver {
});
}
public static void processCallEvents(@NonNull List<ConversationId> threads, long timestamp) {
List<RecipientId> peers = SignalDatabase.threads().getRecipientIdsForThreadIds(threads.stream()
.filter(it -> it.getGroupStoryId() == null)
.map(ConversationId::getThreadId)
.collect(java.util.stream.Collectors.toList()));
for (RecipientId peer : peers) {
CallTable.Call lastCallInThread = SignalDatabase.calls().markAllCallEventsWithPeerBeforeTimestampRead(peer, timestamp);
if (lastCallInThread != null) {
ApplicationDependencies.getJobManager().add(CallLogEventSendJob.forMarkedAsReadInConversation(lastCallInThread));
}
}
}
private static void scheduleDeletion(@NonNull List<ExpirationInfo> expirationInfo) {
if (expirationInfo.size() > 0) {
long now = System.currentTimeMillis();

View File

@@ -138,6 +138,7 @@ object NotificationStateProvider {
) {
private val isGroupStoryReply: Boolean = thread.groupStoryId != null
private val isUnreadIncoming: Boolean = isUnreadMessage && !messageRecord.isOutgoing && !isGroupStoryReply
private val isIncomingMissedCall: Boolean = !messageRecord.isOutgoing && (messageRecord.isMissedAudioCall || messageRecord.isMissedVideoCall)
private val isNotifiableGroupStoryMessage: Boolean =
isUnreadMessage &&
@@ -146,7 +147,7 @@ object NotificationStateProvider {
(isParentStorySentBySelf || messageRecord.hasSelfMention() || (hasSelfRepliedToStory && !messageRecord.isStoryReaction()))
fun includeMessage(notificationProfile: NotificationProfile?): MessageInclusion {
return if (isUnreadIncoming || stickyThread || isNotifiableGroupStoryMessage) {
return if (isUnreadIncoming || stickyThread || isNotifiableGroupStoryMessage || isIncomingMissedCall) {
if (threadRecipient.isMuted && (threadRecipient.isDoNotNotifyMentions || !messageRecord.hasSelfMention())) {
MessageInclusion.MUTE_FILTERED
} else if (notificationProfile != null && !notificationProfile.isRecipientAllowed(threadRecipient.id) && !(notificationProfile.allowAllMentions && messageRecord.hasSelfMention())) {