From 0dfe71ca8f35cc85ba1349f94f794a754d0d3d5a Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Tue, 25 Mar 2025 19:32:43 -0400 Subject: [PATCH] Fix crash when changing username on Android API < 24. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Basically, the crash was caused by using `Collections.unmodifiableList()`, which creates an `UnmodifiableCollection` wrapper around the original `List`. That `UnmodifiableCollection` wrapper contains methods that return `java.util.stream.Stream` – which was added in Java 8, but can be used on Android API < 24 through [desugaring](https://developer.android.com/studio/write/java8-support-table). _However_, it appears that when Jackson is using reflection to serialize `ReserveUsernameRequest`, it examines all of the methods of that class. This results in a `java.lang.NoClassDefFoundError: java.util.stream.Stream`, because the reflection is looking at the actual runtime `UnmodifiableCollection` class and not desugared code. As far as I can tell, that behavior is unavoidable and the only way to avoid this issue is to avoid using `Collections.unmodifiableList()` in classes that are serialized by Jackson on Android API < 24. --- .../signalservice/internal/push/ReserveUsernameRequest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/ReserveUsernameRequest.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/ReserveUsernameRequest.java index 6023c249e6..e0f3d96620 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/ReserveUsernameRequest.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/ReserveUsernameRequest.java @@ -2,7 +2,6 @@ package org.whispersystems.signalservice.internal.push; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Collections; import java.util.List; public class ReserveUsernameRequest { @@ -10,7 +9,7 @@ public class ReserveUsernameRequest { private List usernameHashes; public ReserveUsernameRequest(List usernameHashes) { - this.usernameHashes = Collections.unmodifiableList(usernameHashes); + this.usernameHashes = usernameHashes; } List getUsernameHashes() {