From 0783f4da14d1c7b99fa56a7e85eb2e4fc1c78483 Mon Sep 17 00:00:00 2001 From: kris Date: Sat, 28 Mar 2026 08:21:37 +0800 Subject: [PATCH] fix: serialize forward target payloads --- .../com/hyzq/boss/ForwardTargetActivity.java | 61 ++++++++++++++++++- .../hyzq/boss/ForwardTargetActivityTest.java | 4 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/hyzq/boss/ForwardTargetActivity.java b/android/app/src/main/java/com/hyzq/boss/ForwardTargetActivity.java index 6e7ba98..7a4b407 100644 --- a/android/app/src/main/java/com/hyzq/boss/ForwardTargetActivity.java +++ b/android/app/src/main/java/com/hyzq/boss/ForwardTargetActivity.java @@ -11,7 +11,9 @@ import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class ForwardTargetActivity extends BossScreenActivity { public static final String EXTRA_SOURCE_PROJECT_ID = "source_project_id"; @@ -223,7 +225,7 @@ public class ForwardTargetActivity extends BossScreenActivity { } private static final class MutableJsonObject extends JSONObject { - private final java.util.Map values = new java.util.LinkedHashMap<>(); + private final Map values = new LinkedHashMap<>(); @Override public JSONObject put(String key, boolean value) { @@ -272,6 +274,22 @@ public class ForwardTargetActivity extends BossScreenActivity { Object value = values.get(key); return value instanceof Boolean ? (Boolean) value : fallback; } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("{"); + boolean first = true; + for (Map.Entry entry : values.entrySet()) { + if (!first) { + builder.append(","); + } + first = false; + builder.append("\"").append(escape(entry.getKey())).append("\":"); + builder.append(stringify(entry.getValue())); + } + builder.append("}"); + return builder.toString(); + } } private static final class MutableJsonArray extends JSONArray { @@ -314,5 +332,46 @@ public class ForwardTargetActivity extends BossScreenActivity { Object value = values.get(index); return value instanceof JSONObject ? (JSONObject) value : null; } + + @Override + public String optString(int index) { + if (index < 0 || index >= values.size()) { + return ""; + } + Object value = values.get(index); + return value instanceof String ? (String) value : ""; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("["); + for (int i = 0; i < values.size(); i++) { + if (i > 0) { + builder.append(","); + } + builder.append(stringify(values.get(i))); + } + builder.append("]"); + return builder.toString(); + } + } + + private static String stringify(@Nullable Object value) { + if (value == null) { + return "null"; + } + if (value instanceof String) { + return "\"" + escape((String) value) + "\""; + } + if (value instanceof Number || value instanceof Boolean) { + return String.valueOf(value); + } + return value.toString(); + } + + private static String escape(String value) { + return value + .replace("\\", "\\\\") + .replace("\"", "\\\""); } } diff --git a/android/app/src/test/java/com/hyzq/boss/ForwardTargetActivityTest.java b/android/app/src/test/java/com/hyzq/boss/ForwardTargetActivityTest.java index 9ff8de8..c1d8f9d 100644 --- a/android/app/src/test/java/com/hyzq/boss/ForwardTargetActivityTest.java +++ b/android/app/src/test/java/com/hyzq/boss/ForwardTargetActivityTest.java @@ -28,6 +28,7 @@ public class ForwardTargetActivityTest { assertEquals("single", payload.optString("mode")); assertEquals("m1", payload.optString("sourceMessageId")); + assertEquals("{\"mode\":\"single\",\"sourceMessageId\":\"m1\"}", payload.toString()); } @Test @@ -36,6 +37,9 @@ public class ForwardTargetActivityTest { assertEquals("bundle", payload.optString("mode")); assertEquals(2, payload.optJSONArray("sourceMessageIds").length()); + assertEquals("m1", payload.optJSONArray("sourceMessageIds").optString(0)); + assertEquals("m2", payload.optJSONArray("sourceMessageIds").optString(1)); + assertEquals("{\"mode\":\"bundle\",\"sourceMessageIds\":[\"m1\",\"m2\"]}", payload.toString()); } private static final class StubJSONObject extends JSONObject {