package com.mapbox.mapboxsdk.module.telemetry; import android.annotation.SuppressLint; import android.os.Bundle; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import java.util.ArrayList; import java.util.List; /** * 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” * } *

*/ @SuppressLint("ParcelCreator") class PerformanceEvent extends MapBaseEvent { private static final String PERFORMANCE_TRACE = "mobile.performance_trace"; private final String sessionId; private final List> attributes; private final List> counters; private final JsonObject metadata; PerformanceEvent(PhoneState phoneState, String sessionId, Bundle bundle) { super(phoneState); this.sessionId = sessionId; this.attributes = initList(bundle.getString("attributes"), new TypeToken>>() { }); this.counters = initList(bundle.getString("counters"), new TypeToken>>() { }); this.metadata = initMetaData(bundle.getString("metadata")); } private ArrayList> 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); } } @Override String getEventName() { return PERFORMANCE_TRACE; } String getSessionId() { return sessionId; } List> getAttributes() { return attributes; } List> getCounters() { return counters; } JsonObject getMetadata() { return metadata; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } PerformanceEvent that = (PerformanceEvent) o; if (sessionId != null ? !sessionId.equals(that.sessionId) : that.sessionId != null) { return false; } if (attributes != null ? !attributes.equals(that.attributes) : that.attributes != null) { return false; } if (counters != null ? !counters.equals(that.counters) : that.counters != null) { return false; } return metadata != null ? metadata.equals(that.metadata) : that.metadata == null; } @Override public int hashCode() { int result = sessionId != null ? sessionId.hashCode() : 0; result = 31 * result + (attributes != null ? attributes.hashCode() : 0); result = 31 * result + (counters != null ? counters.hashCode() : 0); result = 31 * result + (metadata != null ? metadata.hashCode() : 0); return result; } @Override public String toString() { return "PerformanceEvent{" + "sessionId='" + sessionId + '\'' + ", attributes=" + attributes + ", counters=" + counters + ", metadata=" + metadata + '}'; } static class PerformanceAttribute { private final String name; private final T value; PerformanceAttribute(String name, T value) { this.name = name; this.value = value; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } PerformanceAttribute that = (PerformanceAttribute) o; if (name != null ? !name.equals(that.name) : that.name != null) { return false; } return value != null ? value.equals(that.value) : that.value == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (value != null ? value.hashCode() : 0); return result; } } }