From 3fa3b93c8554648a70b70f1804093108aaaf9ccb Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 3 Jan 2024 11:10:16 -0500 Subject: [PATCH] Fix improper notifications when delaying for linked device activity. --- .../contacts/sync/ContactDiscovery.kt | 2 +- .../messages/DataMessageProcessor.kt | 4 +-- .../DeleteNotificationReceiver.java | 1 - .../notifications/MessageNotifier.java | 10 ++----- .../OptimizedMessageNotifier.java | 30 ++----------------- .../v2/DefaultMessageNotifier.kt | 26 ++++------------ .../service/webrtc/SignalCallManager.java | 2 +- .../securesms/util/BubbleUtil.java | 2 +- 8 files changed, 16 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt index a88f17ece4..04eb95c69b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt @@ -206,7 +206,7 @@ object ContactDiscovery { .forEach { result -> val hour = Calendar.getInstance()[Calendar.HOUR_OF_DAY] if (hour in 9..22) { - ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(result.threadId), true) + ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(result.threadId)) } else { Log.i(TAG, "Not notifying of a new user due to the time of day. (Hour: $hour)") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt index 9338d0b83b..60ee507ff7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -522,7 +522,7 @@ object DataMessageProcessor { } else { val reactionRecord = ReactionRecord(emoji!!, senderRecipientId, message.timestamp!!, System.currentTimeMillis()) SignalDatabase.reactions.addReaction(targetMessageId, reactionRecord) - ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.fromMessageRecord(targetMessage), false) + ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.fromMessageRecord(targetMessage)) } return targetMessageId @@ -542,7 +542,7 @@ object DataMessageProcessor { SignalDatabase.messages.deleteRemotelyDeletedStory(targetMessage.id) } - ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.fromMessageRecord(targetMessage), false) + ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.fromMessageRecord(targetMessage)) MessageId(targetMessage.id) } else if (targetMessage == null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java index a49e9eaa89..10986db1b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java @@ -24,7 +24,6 @@ public class DeleteNotificationReceiver extends BroadcastReceiver { public void onReceive(final Context context, Intent intent) { if (DELETE_NOTIFICATION_ACTION.equals(intent.getAction())) { MessageNotifier notifier = ApplicationDependencies.getMessageNotifier(); - notifier.clearReminder(context); final long[] ids = intent.getLongArrayExtra(EXTRA_IDS); final boolean[] mms = intent.getBooleanArrayExtra(EXTRA_MMS); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java index 4c37779bb2..af3089c922 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java @@ -26,21 +26,15 @@ public interface MessageNotifier { void cancelDelayedNotifications(); void updateNotification(@NonNull Context context); void updateNotification(@NonNull Context context, @NonNull ConversationId conversationId); - void updateNotification(@NonNull Context context, @NonNull ConversationId conversationId, @NonNull BubbleUtil.BubbleState defaultBubbleState); - void updateNotification(@NonNull Context context, @NonNull ConversationId conversationId, boolean signal); - void updateNotification(@NonNull Context context, @Nullable ConversationId conversationId, boolean signal, int reminderCount, @NonNull BubbleUtil.BubbleState defaultBubbleState); - void clearReminder(@NonNull Context context); + void forceBubbleNotification(@NonNull Context context, @NonNull ConversationId conversationId); void addStickyThread(@NonNull ConversationId conversationId, long earliestTimestamp); void removeStickyThread(@NonNull ConversationId conversationId); - class ReminderReceiver extends BroadcastReceiver { - @Override public void onReceive(final Context context, final Intent intent) { SignalExecutors.BOUNDED.execute(() -> { - int reminderCount = intent.getIntExtra("reminder_count", 0); - ApplicationDependencies.getMessageNotifier().updateNotification(context, null, true, reminderCount + 1, BubbleUtil.BubbleState.HIDDEN); + ApplicationDependencies.getMessageNotifier().updateNotification(context); }); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java index 1c87f418d0..c72f1b7aa9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java @@ -30,7 +30,6 @@ public class OptimizedMessageNotifier implements MessageNotifier { private static final String DEDUPE_KEY_GENERAL = "MESSAGE_NOTIFIER_DEFAULT"; private static final String DEDUPE_KEY_CHAT = "MESSAGE_NOTIFIER_CHAT_"; - private static final String DEDUPE_KEY_CANCEL_DELAYED = "MESSAGE_NOTIFIER_CANCEL_DELAYED"; @MainThread public OptimizedMessageNotifier(@NonNull Application context) { @@ -81,9 +80,7 @@ public class OptimizedMessageNotifier implements MessageNotifier { @Override public void cancelDelayedNotifications() { - SignalDatabase.runPostSuccessfulTransaction(DEDUPE_KEY_CANCEL_DELAYED, () -> { - getNotifier().cancelDelayedNotifications(); - }); + getNotifier().cancelDelayedNotifications(); } @Override @@ -101,30 +98,9 @@ public class OptimizedMessageNotifier implements MessageNotifier { } @Override - public void updateNotification(@NonNull Context context, @NonNull ConversationId conversationId, @NonNull BubbleUtil.BubbleState defaultBubbleState) { + public void forceBubbleNotification(@NonNull Context context, @NonNull ConversationId conversationId) { SignalDatabase.runPostSuccessfulTransaction(() -> { - runOnLimiter(() -> getNotifier().updateNotification(context, conversationId, defaultBubbleState)); - }); - } - - @Override - public void updateNotification(@NonNull Context context, @NonNull ConversationId conversationId, boolean signal) { - SignalDatabase.runPostSuccessfulTransaction(() -> { - runOnLimiter(() -> getNotifier().updateNotification(context, conversationId, signal)); - }); - } - - @Override - public void updateNotification(@NonNull Context context, @Nullable ConversationId conversationId, boolean signal, int reminderCount, @NonNull BubbleUtil.BubbleState defaultBubbleState) { - SignalDatabase.runPostSuccessfulTransaction(() -> { - runOnLimiter(() -> getNotifier().updateNotification(context, conversationId, signal, reminderCount, defaultBubbleState)); - }); - } - - @Override - public void clearReminder(@NonNull Context context) { - SignalDatabase.runPostSuccessfulTransaction(() -> { - getNotifier().clearReminder(context); + runOnLimiter(() -> getNotifier().forceBubbleNotification(context, conversationId)); }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier.kt index 6415773a68..303a8e68cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier.kt @@ -102,7 +102,7 @@ class DefaultMessageNotifier(context: Application) : MessageNotifier { } override fun updateNotification(context: Context) { - updateNotification(context, null, false, 0, BubbleState.HIDDEN) + updateNotification(context, null, BubbleState.HIDDEN) } override fun updateNotification(context: Context, conversationId: ConversationId) { @@ -110,27 +110,17 @@ class DefaultMessageNotifier(context: Application) : MessageNotifier { Log.i(TAG, "Scheduling delayed notification...") executor.enqueue(context, conversationId) } else { - updateNotification(context, conversationId, true) + updateNotification(context, conversationId, BubbleState.HIDDEN) } } - override fun updateNotification(context: Context, conversationId: ConversationId, defaultBubbleState: BubbleState) { - updateNotification(context, conversationId, false, 0, defaultBubbleState) + override fun forceBubbleNotification(context: Context, conversationId: ConversationId) { + updateNotification(context, conversationId, BubbleState.SHOWN) } - override fun updateNotification(context: Context, conversationId: ConversationId, signal: Boolean) { - updateNotification(context, conversationId, signal, 0, BubbleState.HIDDEN) - } - - /** - * @param signal is no longer used - * @param reminderCount is not longer used - */ - override fun updateNotification( + private fun updateNotification( context: Context, conversationId: ConversationId?, - signal: Boolean, - reminderCount: Int, defaultBubbleState: BubbleState ) { NotificationChannels.getInstance().ensureCustomChannelConsistency() @@ -240,10 +230,6 @@ class DefaultMessageNotifier(context: Application) : MessageNotifier { } } - override fun clearReminder(context: Context) { - // Intentionally left blank - } - override fun addStickyThread(conversationId: ConversationId, earliestTimestamp: Long) { stickyThreads[conversationId] = StickyThread(conversationId, NotificationIds.getNotificationIdForThread(conversationId), earliestTimestamp) } @@ -409,8 +395,8 @@ private class CancelableExecutor { } if (!canceled.get()) { Log.i(TAG, "Not canceled, notifying...") - ApplicationDependencies.getMessageNotifier().updateNotification(context, thread, true) ApplicationDependencies.getMessageNotifier().cancelDelayedNotifications() + ApplicationDependencies.getMessageNotifier().updateNotification(context, thread) } else { Log.w(TAG, "Canceled, not notifying...") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index a178af0ef7..a6a1e62636 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -459,7 +459,7 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. peekInfo.getJoinedMembers(), WebRtcUtil.isCallFull(peekInfo)); - ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(threadId), true, 0, BubbleUtil.BubbleState.HIDDEN); + ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(threadId)); EventBus.getDefault().postSticky(new GroupCallPeekEvent(id, peekInfo.getEraId(), peekInfo.getDeviceCount(), peekInfo.getMaxDevices())); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BubbleUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BubbleUtil.java index 93e185b000..979759b89c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/BubbleUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/BubbleUtil.java @@ -120,7 +120,7 @@ public final class BubbleUtil { .orElse(null); if (activeThreadNotification != null && activeThreadNotification.deleteIntent != null) { - ApplicationDependencies.getMessageNotifier().updateNotification(context, conversationId, BubbleState.SHOWN); + ApplicationDependencies.getMessageNotifier().forceBubbleNotification(context, conversationId); } else { Recipient recipient = Recipient.resolved(recipientId); NotificationFactory.notifyToBubbleConversation(context, recipient, threadId);