diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index c703c0823..f9ddb89cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -149,7 +149,7 @@ public final class FeatureFlags { SignalStore.remoteConfigValues().setPendingConfig(mapToJson(result.getDisk())); REMOTE_VALUES.clear(); REMOTE_VALUES.putAll(result.getMemory()); - triggerFlagChangeListeners(result.getChanges()); + triggerFlagChangeListeners(result.getMemoryChanges()); SignalStore.remoteConfigValues().setLastFetchTime(System.currentTimeMillis()); @@ -271,6 +271,17 @@ public final class FeatureFlags { } }); + Stream.of(allKeys) + .filterNot(remoteCapable::contains) + .filterNot(key -> sticky.contains(key) && localDisk.get(key) == Boolean.TRUE) + .forEach(key -> { + newDisk.remove(key); + + if (hotSwap.contains(key)) { + newMemory.remove(key); + } + }); + return new UpdateResult(newMemory, newDisk, computeChanges(localMemory, newMemory)); } @@ -367,12 +378,12 @@ public final class FeatureFlags { static final class UpdateResult { private final Map memory; private final Map disk; - private final Map changes; + private final Map memoryChanges; - UpdateResult(@NonNull Map memory, @NonNull Map disk, @NonNull Map changes) { - this.memory = memory; - this.disk = disk; - this.changes = changes; + UpdateResult(@NonNull Map memory, @NonNull Map disk, @NonNull Map memoryChanges) { + this.memory = memory; + this.disk = disk; + this.memoryChanges = memoryChanges; } public @NonNull Map getMemory() { @@ -383,8 +394,8 @@ public final class FeatureFlags { return disk; } - public @NonNull Map getChanges() { - return changes; + public @NonNull Map getMemoryChanges() { + return memoryChanges; } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java index e8fe3bb21..fae628774 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlagsTest.java @@ -31,7 +31,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf("A", true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -45,7 +45,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -59,7 +59,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertEquals(Change.ENABLED, result.getChanges().get(A)); + assertEquals(Change.ENABLED, result.getMemoryChanges().get(A)); } @Test @@ -73,7 +73,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -87,7 +87,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertEquals(Change.ENABLED, result.getChanges().get(A)); + assertEquals(Change.ENABLED, result.getMemoryChanges().get(A)); } @Test @@ -101,7 +101,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, false), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -115,7 +115,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertEquals(Change.ENABLED, result.getChanges().get(A)); + assertEquals(Change.ENABLED, result.getMemoryChanges().get(A)); } @Test @@ -129,7 +129,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertEquals(Change.ENABLED, result.getChanges().get(A)); + assertEquals(Change.ENABLED, result.getMemoryChanges().get(A)); } @Test @@ -143,7 +143,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -157,7 +157,21 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); + } + + @Test + public void updateInternal_removeValue_notRemoteCapable() { + UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + mapOf(A, true), + mapOf(A, true), + setOf(), + setOf(), + setOf()); + + assertEquals(mapOf(A, true), result.getMemory()); + assertEquals(mapOf(), result.getDisk()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -171,7 +185,21 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf(), result.getDisk()); - assertEquals(Change.REMOVED, result.getChanges().get(A)); + assertEquals(Change.REMOVED, result.getMemoryChanges().get(A)); + } + + @Test + public void updateInternal_removeValue_hotSwap_notRemoteCapable() { + UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + mapOf(A, true), + mapOf(A, true), + setOf(), + setOf(A), + setOf()); + + assertEquals(mapOf(), result.getMemory()); + assertEquals(mapOf(), result.getDisk()); + assertEquals(Change.REMOVED, result.getMemoryChanges().get(A)); } @Test @@ -185,7 +213,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -199,7 +227,21 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, false), result.getMemory()); assertEquals(mapOf(), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); + } + + @Test + public void updateInternal_removeValue_stickyNotEnabled_notRemoteCapable() { + UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + mapOf(A, false), + mapOf(A, false), + setOf(), + setOf(), + setOf(A)); + + assertEquals(mapOf(A, false), result.getMemory()); + assertEquals(mapOf(), result.getDisk()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -213,7 +255,21 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true), result.getMemory()); assertEquals(mapOf(A, true), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); + } + + @Test + public void updateInternal_removeValue_hotSwap_stickyAlreadyEnabled_notRemoteCapable() { + UpdateResult result = FeatureFlags.updateInternal(mapOf(A, true), + mapOf(A, true), + mapOf(A, true), + setOf(), + setOf(A), + setOf(A)); + + assertEquals(mapOf(A, true), result.getMemory()); + assertEquals(mapOf(A, true), result.getDisk()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -227,7 +283,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf(), result.getDisk()); - assertEquals(Change.REMOVED, result.getChanges().get(A)); + assertEquals(Change.REMOVED, result.getMemoryChanges().get(A)); } @Test @@ -242,7 +298,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(), result.getMemory()); assertEquals(mapOf(A, true, B, false), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test @@ -259,7 +315,7 @@ public class FeatureFlagsTest { assertEquals(mapOf(A, true, B, true), result.getMemory()); assertEquals(mapOf(A, true, B, false), result.getDisk()); - assertTrue(result.getChanges().isEmpty()); + assertTrue(result.getMemoryChanges().isEmpty()); } @Test