diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java | 94 |
1 files changed, 88 insertions, 6 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java index b88e1885ca..12d1fe46cf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/module/telemetry/PerformanceEvent.java @@ -1,20 +1,55 @@ package com.mapbox.mapboxsdk.module.telemetry; +import com.google.gson.Gson; + +import com.google.gson.JsonObject; + +import com.google.gson.reflect.TypeToken; import com.mapbox.android.telemetry.Event; import android.os.Bundle; import android.os.Parcel; + import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; /** * Generic Performance Event that can be used for performance measurements. * Customer measurements can be added to the bundle. + * + * Bundle is expected to have following properties: + * "attributes", "counters", and "metadata" with String values. + * + * Attributes: a string representing an array of name/string value pair objects. + * Counters: a string representing an array of name/number value pair objects. + * Metadata is a string representation of a JsonObject with string values. + * + * Here is an example of a Performance event bundle data: + * + * "attributes": [{ "name": "style_id", "value": "mapbox://styles/mapbox/streets-v10"}] + * + * "counters": [{"name": "fps_average", "value": 90.7655486547093}, + * {"name": "fps_deviation", "value": 29.301809631465574}] + * “metadata”: { + * “version”: “9”, + * “screenSize”: “1080x1794”, + * “country”: “US”, + * “device”: “Pixel 2”, + * “abi”: “arm64-v8a”, + * “brand”: “google”, + * “ram”: “3834167296”, + * “os”: “android”, + * “gpu”: “Qualcomm, Adreno (TM) 540, OpenGL ES 3.2 V@313.0 (GIT@7bf2852, Ie32bfa6f6f)“, + * “manufacturer”: “Google” + * } */ public class PerformanceEvent extends Event { - private static final String PERFORMANCE_TRACE = "performance.trace"; + + private static final String PERFORMANCE_TRACE = "mobile.performance_trace"; private final String event; @@ -22,23 +57,36 @@ public class PerformanceEvent extends Event { private final String sessionId; - private final Bundle data; + private final List<Attribute<String>> attributes; + + private final List<Attribute<Double>> counters; + + private final JsonObject metadata; + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US); - PerformanceEvent(String sessionId, Bundle data) { + PerformanceEvent(String sessionId, Bundle bundle) { + this.event = PERFORMANCE_TRACE; this.created = DATE_FORMAT.format(new Date()); this.sessionId = sessionId; - this.data = data; + this.attributes = initList(bundle.getString("attributes"), + new TypeToken<ArrayList<Attribute<String>>>() {}); + this.counters = initList(bundle.getString("counters"), + new TypeToken<ArrayList<Attribute<Double>>>() {}); + this.metadata = initMetaData(bundle.getString("metadata")); } private PerformanceEvent(Parcel in) { this.event = in.readString(); this.created = in.readString(); this.sessionId = in.readString(); - this.data = in.readBundle(); + + this.attributes = initList(in.readString(), new TypeToken<ArrayList<Attribute<String>>>() {}); + this.counters = initList(in.readString(), new TypeToken<ArrayList<Attribute<Double>>>() {}); + this.metadata = initMetaData(in.readString()); } @Override @@ -51,7 +99,30 @@ public class PerformanceEvent extends Event { parcel.writeString(event); parcel.writeString(created); parcel.writeString(sessionId); - parcel.writeBundle(data); + + Gson gson = new Gson(); + + parcel.writeString(gson.toJson(attributes)); + parcel.writeString(gson.toJson(counters)); + + if (metadata != null) { + parcel.writeString(metadata.toString()); + } + } + + private <T> ArrayList<Attribute<T>> initList(String fromString, TypeToken typeToken) { + if (fromString == null || fromString.isEmpty()) { + return new ArrayList<>(); + } + return new Gson().fromJson(fromString, typeToken.getType()); + } + + private JsonObject initMetaData(String fromString) { + if (fromString == null) { + return new JsonObject(); + } else { + return new Gson().fromJson(fromString, JsonObject.class); + } } public static final Creator<PerformanceEvent> CREATOR = new Creator<PerformanceEvent>() { @@ -65,4 +136,15 @@ public class PerformanceEvent extends Event { return new PerformanceEvent[size]; } }; + + + private class Attribute<T> { + private final String name; + private final T value; + + Attribute(String name, T value) { + this.name = name; + this.value = value; + } + } } |