summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorBrad Leege <bleege@gmail.com>2016-02-01 16:29:22 -0600
committerBrad Leege <bleege@gmail.com>2016-02-10 19:05:20 -0800
commit2690cc09f86469153b0e34815013aef016d7b9e5 (patch)
tree8c6fefaceffa78630ff729fe0943b1c1e6504cce /platform
parent8464d68687b172df7508fc18af7b3558d097ca71 (diff)
downloadqtlocation-mapboxgl-2690cc09f86469153b0e34815013aef016d7b9e5.tar.gz
[android] #2421 - Building out MapboxEventsManager with support for Staging and Prod servers
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java10
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEvent.java17
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEventManager.java160
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/TelemetryLocationReceiver.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml6
5 files changed, 195 insertions, 0 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
index 33ebfca2fa..7c5fdf293a 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java
@@ -18,6 +18,16 @@ public class MapboxConstants {
public static final String KEY_META_DATA_MANIFEST = "com.mapbox.AccessToken";
/**
+ * Key used to store staging data server url in AndroidManifest.xml
+ */
+ public static final String KEY_META_DATA_STAGING_SERVER = "com.mapbox.TestEventsServer";
+
+ /**
+ * Key used to store staging data server access token in AndroidManifest.xml
+ */
+ public static final String KEY_META_DATA_STAGING_ACCESS_TOKEN = "com.mapbox.TestEventsAccessToken";
+
+ /**
* Default animation time
*/
public static final int ANIMATION_DURATION = 300;
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEvent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEvent.java
new file mode 100644
index 0000000000..6b60c66cf7
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEvent.java
@@ -0,0 +1,17 @@
+package com.mapbox.mapboxsdk.telemetry;
+
+import java.io.Serializable;
+
+public class MapboxEvent implements Serializable {
+ public static final int version = 1;
+ public static final String MGLMapboxEventsUserAgent = "Sirius/1.0/ANDROID MapboxEventsiOS/1.1";
+ public static final String MGLMapboxEventsAPIBase = "https://api.tiles.mapbox.com";
+
+ public static final String MGLEventKeyLatitude = "lat";
+ public static final String MGLEventKeyLongitude = "lng";
+ public static final String MGLEventKeySpeed = "speed";
+ public static final String MGLEventKeyCourse = "course";
+ public static final String MGLEventKeyAltitude = "altitude";
+ public static final String MGLEventKeyHorizontalAccuracy = "horizontalAccuracy";
+ public static final String MGLEventKeyVerticalAccuracy = "verticalAccuracy";
+}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEventManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEventManager.java
new file mode 100644
index 0000000000..ac87a37135
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/MapboxEventManager.java
@@ -0,0 +1,160 @@
+package com.mapbox.mapboxsdk.telemetry;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.location.Location;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.AsyncTask;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import android.util.Log;
+import com.mapbox.mapboxsdk.constants.MapboxConstants;
+import com.mapbox.mapboxsdk.utils.ApiAccess;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Locale;
+import java.util.Vector;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+public class MapboxEventManager {
+
+ private static final String TAG = "MapboxEventManager";
+
+ private static MapboxEventManager mapboxEventManager = null;
+
+ private final Vector<Hashtable<String, Object>> events = new Vector<>();
+ private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+ private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
+
+ private Context context = null;
+ private String accessToken = null;
+ private static final String MAPBOX_EVENTS_BASE_URL = "https://api.tiles.mapbox.com";
+ private String eventsURL = MAPBOX_EVENTS_BASE_URL;
+
+ private MapboxEventManager(@NonNull Context context) {
+ super();
+ this.accessToken = ApiAccess.getToken(context);
+ this.context = context;
+
+ // Check for Staging Server Information
+ try {
+ ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
+ String stagingURL = appInfo.metaData.getString(MapboxConstants.KEY_META_DATA_STAGING_SERVER);
+ String stagingAccessToken = appInfo.metaData.getString(MapboxConstants.KEY_META_DATA_STAGING_ACCESS_TOKEN);
+
+ if (!TextUtils.isEmpty(stagingURL)) {
+ eventsURL = stagingURL;
+ }
+
+ if (!TextUtils.isEmpty(stagingAccessToken)) {
+ this.accessToken = stagingAccessToken;
+ }
+
+ } catch (Exception e) {
+ Log.e(TAG, "Error Trying to load Staging Credentials: " + e.toString());
+ }
+ }
+
+ public static MapboxEventManager getMapboxEventManager(@NonNull Context context) {
+ if (mapboxEventManager == null) {
+ mapboxEventManager = new MapboxEventManager(context);
+ }
+ return mapboxEventManager;
+ }
+
+ public void addLocationEvent(Location location) {
+ // Add Location even to queue
+ Hashtable<String, Object> event = new Hashtable<>();
+ event.put(MapboxEvent.MGLEventKeyLatitude, location.getLatitude());
+ event.put(MapboxEvent.MGLEventKeyLongitude, location.getLongitude());
+ event.put(MapboxEvent.MGLEventKeySpeed, location.hasSpeed() ? location.getSpeed() : -1);
+ event.put(MapboxEvent.MGLEventKeyCourse, location.hasBearing() ? location.getBearing() : -1);
+ event.put(MapboxEvent.MGLEventKeyAltitude, location.hasAltitude() ? location.getAltitude() : 0);
+ event.put(MapboxEvent.MGLEventKeyHorizontalAccuracy, location.hasAccuracy() ? location.getAccuracy() : 0);
+ event.put(MapboxEvent.MGLEventKeyVerticalAccuracy, location.hasAccuracy() ? location.getAccuracy() : 0);
+ event.put("created", dateFormat.format(new Date()));
+
+ events.add(event);
+
+ // If size > 1 then flush
+ if (events.size() >= 1) {
+ new FlushTheEventsTask().execute();
+ }
+
+ }
+
+ private class FlushTheEventsTask extends AsyncTask<Void, Void, Void> {
+
+ @Override
+ protected Void doInBackground(Void... voids) {
+
+ // Check for NetworkConnectivity
+ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo networkInfo = cm.getActiveNetworkInfo();
+ if (networkInfo == null || !networkInfo.isConnected()) {
+ Log.w(TAG, "Not connected to network, so returning without attempting to send events");
+ return null;
+ }
+
+ try {
+ // Send data
+ // =========
+ JSONArray jsonArray = new JSONArray();
+
+ for (Hashtable<String, Object> evt : events) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put(MapboxEvent.MGLEventKeyLatitude, evt.get(MapboxEvent.MGLEventKeyLatitude));
+ jsonObject.put(MapboxEvent.MGLEventKeyLongitude, evt.get(MapboxEvent.MGLEventKeyLongitude));
+ jsonObject.put(MapboxEvent.MGLEventKeySpeed, evt.get(MapboxEvent.MGLEventKeySpeed));
+ jsonObject.put(MapboxEvent.MGLEventKeyCourse, evt.get(MapboxEvent.MGLEventKeyCourse));
+ jsonObject.put(MapboxEvent.MGLEventKeyAltitude, evt.get(MapboxEvent.MGLEventKeyAltitude));
+ jsonObject.put(MapboxEvent.MGLEventKeyHorizontalAccuracy, evt.get(MapboxEvent.MGLEventKeyHorizontalAccuracy));
+ jsonObject.put(MapboxEvent.MGLEventKeyVerticalAccuracy, evt.get(MapboxEvent.MGLEventKeyVerticalAccuracy));
+
+ // Basic Event Meta Data
+ jsonObject.put("event", "location");
+ jsonObject.put("version", 1);
+ jsonObject.put("instance", "FFFFFFFF-GGGG-HHHH-IIII-JJJJJJJJJJJJ");
+ jsonObject.put("created", evt.get("created"));
+ jsonObject.put("anonid", "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
+ jsonObject.put("appBundleId", "com.mapbox.hermes.android");
+
+ jsonArray.put(jsonObject);
+ }
+
+ OkHttpClient client = new OkHttpClient();
+ RequestBody body = RequestBody.create(JSON, jsonArray.toString());
+
+ String url = eventsURL + "/events/v1?access_token=" + accessToken;
+ Log.i(TAG, "url = " + url);
+
+ Request request = new Request.Builder()
+ .url(url)
+ .header("User-Agent", MapboxEvent.MGLMapboxEventsUserAgent)
+ .post(body)
+ .build();
+ Response response = client.newCall(request).execute();
+ Log.i(TAG, "Response Code from Mapbox Events Server: " + response.code());
+
+ // Reset Events
+ // ============
+ events.removeAllElements();
+ } catch (Exception e) {
+ Log.e(TAG, "FlushTheEventsTask borked: " + e);
+ }
+
+ return null;
+ }
+
+ }
+
+}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/TelemetryLocationReceiver.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/TelemetryLocationReceiver.java
index 96d1a8699c..09310f9d69 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/TelemetryLocationReceiver.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/telemetry/TelemetryLocationReceiver.java
@@ -64,6 +64,8 @@ public class TelemetryLocationReceiver extends BroadcastReceiver {
Location location = (Location)intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
if (location != null) {
Log.i(TAG, "location received = " + location);
+ MapboxEventManager.getMapboxEventManager(context).addLocationEvent(location);
+
final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
tg.startTone(ToneGenerator.TONE_PROP_BEEP);
tg.stopTone();
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
index 70c9259faa..cc32c1e558 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
@@ -90,6 +90,12 @@
android:name="com.mapbox.AccessToken"
android:value="" />
+ <meta-data android:name="com.mapbox.TestEventsServer"
+ android:value="https://cloudfront-staging.tilestream.net"/>
+
+ <meta-data android:name="com.mapbox.TestEventsAccessToken"
+ android:value="sk.eyJ1IjoiYmxlZWdlIiwiYSI6InNpcml1c2x5In0.KyT-boMyC_xZYTYojTc8zg"/>
+
<service android:name="com.mapbox.mapboxsdk.telemetry.TelemetryService"/>
</application>