From b4088b6479504e3cc6565da6f4eb4e4fd041884a Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 6 Apr 2017 10:15:06 -0700 Subject: [PATCH] Backport JSONObject.wrap in order to support Jellybean (#3566) --- shell/platform/android/BUILD.gn | 1 + .../plugin/common/JSONMessageCodec.java | 2 +- .../plugin/common/JSONMethodCodec.java | 6 +- .../io/flutter/plugin/common/JSONUtil.java | 64 +++++++++++++++++++ .../plugin/editing/TextInputPlugin.java | 3 +- travis/licenses_golden/licenses_flutter | 1 + 6 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 shell/platform/android/io/flutter/plugin/common/JSONUtil.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index f96892faf..ece9b15c6 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -80,6 +80,7 @@ java_library("flutter_shell_java") { "io/flutter/plugin/common/FlutterMethodChannel.java", "io/flutter/plugin/common/JSONMessageCodec.java", "io/flutter/plugin/common/JSONMethodCodec.java", + "io/flutter/plugin/common/JSONUtil.java", "io/flutter/plugin/common/MessageCodec.java", "io/flutter/plugin/common/MethodCall.java", "io/flutter/plugin/common/MethodCodec.java", diff --git a/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java b/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java index d3f1d0566..d534b209e 100644 --- a/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java +++ b/shell/platform/android/io/flutter/plugin/common/JSONMessageCodec.java @@ -26,7 +26,7 @@ public final class JSONMessageCodec implements MessageCodec { if (message == null) { return null; } - return StringCodec.INSTANCE.encodeMessage(JSONObject.wrap(message).toString()); + return StringCodec.INSTANCE.encodeMessage(JSONUtil.wrap(message).toString()); } @Override diff --git a/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java b/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java index bdc1ce7d4..03b2203c2 100644 --- a/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java +++ b/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java @@ -21,7 +21,7 @@ public final class JSONMethodCodec implements MethodCodec { try { final JSONObject map = new JSONObject(); map.put("method", methodCall.method); - map.put("args", JSONObject.wrap(methodCall.arguments)); + map.put("args", JSONUtil.wrap(methodCall.arguments)); return JSONMessageCodec.INSTANCE.encodeMessage(map); } catch (JSONException e) { throw new IllegalArgumentException("Invalid JSON", e); @@ -49,7 +49,7 @@ public final class JSONMethodCodec implements MethodCodec { @Override public ByteBuffer encodeSuccessEnvelope(Object result) { return JSONMessageCodec.INSTANCE - .encodeMessage(new JSONArray().put(JSONObject.wrap(result))); + .encodeMessage(new JSONArray().put(JSONUtil.wrap(result))); } @Override @@ -58,7 +58,7 @@ public final class JSONMethodCodec implements MethodCodec { return JSONMessageCodec.INSTANCE.encodeMessage(new JSONArray() .put(errorCode) .put(errorMessage) - .put(JSONObject.wrap(errorDetails))); + .put(JSONUtil.wrap(errorDetails))); } @Override diff --git a/shell/platform/android/io/flutter/plugin/common/JSONUtil.java b/shell/platform/android/io/flutter/plugin/common/JSONUtil.java new file mode 100644 index 000000000..12cb9d179 --- /dev/null +++ b/shell/platform/android/io/flutter/plugin/common/JSONUtil.java @@ -0,0 +1,64 @@ +package io.flutter.plugin.common; + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.Map; +import org.json.JSONArray; +import org.json.JSONObject; + +public class JSONUtil { + private JSONUtil() { + } + + /** + * Backport of {@link JSONObject#wrap(Object)} for use on pre-KitKat + * systems. + */ + public static Object wrap(Object o) { + if (o == null) { + return JSONObject.NULL; + } + if (o instanceof JSONArray || o instanceof JSONObject) { + return o; + } + if (o.equals(JSONObject.NULL)) { + return o; + } + try { + if (o instanceof Collection) { + JSONArray result = new JSONArray(); + for (Object e : (Collection) o) + result.put(wrap(e)); + return result; + } else if (o.getClass().isArray()) { + JSONArray result = new JSONArray(); + int length = Array.getLength(o); + for (int i = 0; i < length; i++) + result.put(wrap(Array.get(o, i))); + return result; + } + if (o instanceof Map) { + JSONObject result = new JSONObject(); + for (Map.Entry entry: ((Map) o).entrySet()) + result.put((String) entry.getKey(), wrap(entry.getValue())); + return result; + } + if (o instanceof Boolean || + o instanceof Byte || + o instanceof Character || + o instanceof Double || + o instanceof Float || + o instanceof Integer || + o instanceof Long || + o instanceof Short || + o instanceof String) { + return o; + } + if (o.getClass().getPackage().getName().startsWith("java.")) { + return o.toString(); + } + } catch (Exception ignored) { + } + return null; + } +} diff --git a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java index c6946289e..7125f9dc3 100644 --- a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java +++ b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java @@ -15,6 +15,7 @@ import io.flutter.plugin.common.FlutterMethodChannel; import io.flutter.plugin.common.FlutterMethodChannel.MethodCallHandler; import io.flutter.plugin.common.FlutterMethodChannel.Response; import io.flutter.plugin.common.JSONMethodCodec; +import io.flutter.plugin.common.JSONUtil; import io.flutter.plugin.common.MethodCall; import io.flutter.view.FlutterView; @@ -137,7 +138,7 @@ public class TextInputPlugin implements MethodCallHandler { } void setLatestEditingState(Map state) { - mLatestState = (JSONObject) JSONObject.wrap(state); + mLatestState = (JSONObject) JSONUtil.wrap(state); } private void clearTextInputClient() { diff --git a/travis/licenses_golden/licenses_flutter b/travis/licenses_golden/licenses_flutter index c8cd611d1..be88f5757 100644 --- a/travis/licenses_golden/licenses_flutter +++ b/travis/licenses_golden/licenses_flutter @@ -1073,6 +1073,7 @@ FILE: ../../../flutter/lib/ui/window/window.h FILE: ../../../flutter/runtime/platform_impl.h FILE: ../../../flutter/shell/common/skia_event_tracer_impl.cc FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONMethodCodec.java +FILE: ../../../flutter/shell/platform/android/io/flutter/plugin/common/JSONUtil.java FILE: ../../../flutter/shell/platform/darwin/desktop/Info.plist FILE: ../../../flutter/shell/platform/darwin/desktop/flutter_mac.xib FILE: ../../../flutter/shell/platform/darwin/ios/framework/Flutter.podspec