From 8c7975d89a9c3552fbe8e546e5de97f237c32b21 Mon Sep 17 00:00:00 2001
From: Chris Eager <chris@signal.org>
Date: Mon, 18 Sep 2023 16:39:37 -0500
Subject: [PATCH] =?UTF-8?q?Clear=20presence=20only=20if=20the=20connection?=
 =?UTF-8?q?=E2=80=99s=20displacement=20listener=20is=20still=20present?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../textsecuregcm/push/ClientPresenceManager.java          | 7 ++++---
 .../textsecuregcm/push/ClientPresenceManagerTest.java      | 3 +++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java
index 5015c8da6..fc7d455e1 100644
--- a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java
+++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java
@@ -235,11 +235,12 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter<String, Str
 
   public boolean clearPresence(final UUID accountUuid, final long deviceId, final DisplacedPresenceListener listener) {
     final String presenceKey = getPresenceKey(accountUuid, deviceId);
-    if (!displacementListenersByPresenceKey.remove(presenceKey, listener)) {
+    if (displacementListenersByPresenceKey.remove(presenceKey, listener)) {
+      return clearPresence(presenceKey);
+    } else {
       displacementListenerAlreadyRemovedCounter.increment();
+      return false;
     }
-    return clearPresence(presenceKey);
-
   }
 
   private boolean clearPresence(final String presenceKey) {
diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java
index 8ce5dfaa4..82e70b5cf 100644
--- a/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java
+++ b/service/src/test/java/org/whispersystems/textsecuregcm/push/ClientPresenceManagerTest.java
@@ -10,6 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.Mockito.mock;
 
 import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
@@ -161,6 +162,8 @@ class ClientPresenceManagerTest {
     assertFalse(clientPresenceManager.isPresent(accountUuid, deviceId));
 
     clientPresenceManager.setPresent(accountUuid, deviceId, NO_OP);
+    assertFalse(clientPresenceManager.clearPresence(accountUuid, deviceId,
+        ignored -> fail("this listener should never be called")));
     assertTrue(clientPresenceManager.clearPresence(accountUuid, deviceId, NO_OP));
 
     clientPresenceManager.setPresent(accountUuid, deviceId, NO_OP);
-- 
GitLab