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 5015c8da61199ef3671335712c5abd775ea842fa..fc7d455e1a99de6ef9c4eaa7cbf533866e649fee 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 8ce5dfaa4c0fb391321abb6da6381adece667e55..82e70b5cf7ebbb7ec48f4c129c56bb3af24afaa8 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);