diff options
author | Brad Leege <bleege@gmail.com> | 2016-02-01 16:29:22 -0600 |
---|---|---|
committer | Brad Leege <bleege@gmail.com> | 2016-02-10 19:05:20 -0800 |
commit | 2690cc09f86469153b0e34815013aef016d7b9e5 (patch) | |
tree | 8c6fefaceffa78630ff729fe0943b1c1e6504cce /platform | |
parent | 8464d68687b172df7508fc18af7b3558d097ca71 (diff) | |
download | qtlocation-mapboxgl-2690cc09f86469153b0e34815013aef016d7b9e5.tar.gz |
[android] #2421 - Building out MapboxEventsManager with support for Staging and Prod servers
Diffstat (limited to 'platform')
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> |