package com.github.wuxudong.rncharts.utils; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableNativeMap; import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.data.BubbleEntry; import com.github.mikephil.charting.data.CandleEntry; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.data.RadarEntry; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.Iterator; import java.util.Map; /** * Helper utilities to convert from Entry to WritableMap */ public final class EntryToWritableMapUtils { public static WritableMap convertEntryToWritableMap(Entry entry) { if(entry == null) { return null; } WritableMap map = new WritableNativeMap(); if(entry.getData() instanceof Map) { map.putMap("data", convertMapToWritableMap((Map) entry.getData())); } if (entry instanceof BarEntry) { BarEntry barEntry = (BarEntry) entry; map.putDouble("x", entry.getX()); if (barEntry.getYVals() != null) { WritableArray array = new WritableNativeArray(); for (float f: barEntry.getYVals()) { array.pushDouble(f); } map.putArray("yValues", array); } else { map.putDouble("y", entry.getY()); } } else if (entry instanceof BubbleEntry) { BubbleEntry bubbleEntry = (BubbleEntry) entry; map.putDouble("x", entry.getX()); map.putDouble("y", entry.getY()); map.putDouble("size", bubbleEntry.getSize()); } else if (entry instanceof CandleEntry) { CandleEntry candleEntry = (CandleEntry) entry; map.putDouble("x", entry.getX()); map.putDouble("open", candleEntry.getOpen()); map.putDouble("close", candleEntry.getClose()); map.putDouble("low", candleEntry.getLow()); map.putDouble("high", candleEntry.getHigh()); } else if (entry instanceof PieEntry) { PieEntry pieEntry = (PieEntry) entry; map.putDouble("value", pieEntry.getValue()); map.putString("label", pieEntry.getLabel()); } else if (entry instanceof RadarEntry) { RadarEntry radarEntry = (RadarEntry) entry; map.putDouble("value", radarEntry.getValue()); } else { map.putDouble("x", entry.getX()); map.putDouble("y", entry.getY()); } return map; } private static WritableMap convertMapToWritableMap(Map map) { return convertJsonToWritableMap(new JSONObject(map)); } private static WritableMap convertJsonToWritableMap(JSONObject jsonObject) { if(jsonObject == null) { return null; } WritableMap map = new WritableNativeMap(); try { Iterator<String> iterator = jsonObject.keys(); while (iterator.hasNext()) { String key = iterator.next(); Object value = jsonObject.get(key); if (value instanceof JSONObject) { map.putMap(key, convertJsonToWritableMap((JSONObject) value)); } else if (value instanceof JSONArray) { map.putArray(key, convertJsonToWritableArray((JSONArray) value)); } else if (value instanceof Boolean) { map.putBoolean(key, (Boolean) value); } else if (value instanceof Integer) { map.putInt(key, (Integer) value); } else if (value instanceof Double) { map.putDouble(key, (Double) value); } else if (value instanceof String) { map.putString(key, (String) value); } else { map.putString(key, value.toString()); } } } catch(JSONException ex) { map.putString("error", "Failed to convert JSONObject to WritableMap: " + ex.getMessage()); } return map; } private static WritableArray convertJsonToWritableArray(JSONArray jsonArray) throws JSONException { WritableArray array = new WritableNativeArray(); for (int i = 0; i < jsonArray.length(); i++) { Object value = jsonArray.get(i); if (value instanceof JSONObject) { array.pushMap(convertJsonToWritableMap((JSONObject) value)); } else if (value instanceof JSONArray) { array.pushArray(convertJsonToWritableArray((JSONArray) value)); } else if (value instanceof Boolean) { array.pushBoolean((Boolean) value); } else if (value instanceof Integer) { array.pushInt((Integer) value); } else if (value instanceof Double) { array.pushDouble((Double) value); } else if (value instanceof String) { array.pushString((String) value); } else { array.pushString(value.toString()); } } return array; } }