Skip to content

Commit

Permalink
Telemetry module (#282)
Browse files Browse the repository at this point in the history
* update test app with new location logic, including AndroidLocationEngine

* okhttp dependency and telemetry extra fields

* extracted exponential backoff logic

* telemetry http client

* telemetry background service

* refactored telemetry utils used for event building

* core MapboxTelemetry object

* remove unused import

* add a publish-local rule for local maven repo access and fix required javadoc issues

* a few bug fixes and enhanced logging after integration with a standalone test app

* remove unused key/attributes and make their name consistent

* make method names consistent for map events

* simplify constants for rotation and lat/lon data

* round and scale location values

* respect user preferences and send turnstile event when appropriate

* reformat

* several improvements to the overal flow

* match ios value

* wrap request build for safety

* avoid a permissions exception

* added synchronized to getInstance creation

* extract TelemetryConstants.TELEMETRY_SERVICE_NAME constant

* wrap logging into another TelemetryException

* remove unnecessary editor.commit()

* remove extra line
  • Loading branch information
zugaldia authored Jan 25, 2017
1 parent 7af5094 commit 6d56821
Show file tree
Hide file tree
Showing 25 changed files with 1,835 additions and 131 deletions.
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ publish-android:
cd mapbox; ./gradlew :libandroid-services:uploadArchives
cd mapbox; ./gradlew :libandroid-ui:uploadArchives

publish-local:
# This publishes to ~/.m2/repository/com/mapbox/mapboxsdk
cd mapbox; ./gradlew :libjava-core:install
cd mapbox; ./gradlew :libjava-geojson:install
cd mapbox; ./gradlew :libjava-services:install
cd mapbox; ./gradlew :libjava-services-rx:install
# cd mapbox; ./gradlew :libandroid-telemetry:install
# cd mapbox; ./gradlew :libandroid-services:install
# cd mapbox; ./gradlew :libandroid-ui:install

dex-count:
cd mapbox; ./gradlew countDebugDexMethods
cd mapbox; ./gradlew countReleaseDexMethods
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,22 @@
import com.mapbox.services.android.telemetry.location.LocationEnginePriority;
import com.mapbox.services.android.telemetry.permissions.PermissionsManager;

import java.util.concurrent.CopyOnWriteArrayList;

/**
* Sample LocationEngine using Google Play Services
*/
public class GoogleLocationEngine implements LocationEngine,
public class GoogleLocationEngine extends LocationEngine implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

private static final String LOG_TAG = GoogleLocationEngine.class.getSimpleName();

private static LocationEngine instance;

private Context context;
private CopyOnWriteArrayList<LocationEngineListener> locationListeners;
private GoogleApiClient googleApiClient;

private int priority;

public GoogleLocationEngine(Context context) {
super();
this.context = context;
locationListeners = new CopyOnWriteArrayList<>();
googleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
Expand Down Expand Up @@ -74,7 +69,7 @@ public boolean isConnected() {

@Override
public void onConnected(@Nullable Bundle bundle) {
for (LocationEngineListener listener : this.locationListeners) {
for (LocationEngineListener listener : locationListeners) {
listener.onConnected();
}
}
Expand All @@ -89,39 +84,16 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(LOG_TAG, "Connection failed:" + connectionResult.getErrorMessage());
}

@Override
public int getPriority() {
return priority;
}

@Override
public void setPriority(int priority) {
this.priority = priority;
}

@Override
public Location getLastLocation() {
if (googleApiClient.isConnected()
&& PermissionsManager.isPermissionGranted(context, PermissionsManager.FINE_LOCATION_PERMISSION)) {
if (googleApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
//noinspection MissingPermission
return LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
}

return null;
}

@Override
public void addLocationEngineListener(LocationEngineListener listener) {
if (!this.locationListeners.contains(listener)) {
this.locationListeners.add(listener);
}
}

@Override
public boolean removeLocationEngineListener(LocationEngineListener listener) {
return this.locationListeners.remove(listener);
}

@Override
public void requestLocationUpdates() {
// Common params
Expand All @@ -140,8 +112,10 @@ public void requestLocationUpdates() {
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

//noinspection MissingPermission
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this);
if (googleApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
//noinspection MissingPermission
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this);
}
}

@Override
Expand All @@ -151,7 +125,7 @@ public void removeLocationUpdates() {

@Override
public void onLocationChanged(Location location) {
for (LocationEngineListener listener : this.locationListeners) {
for (LocationEngineListener listener : locationListeners) {
listener.onLocationChanged(location);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package com.mapbox.services.android.testapp.location;

import android.location.Location;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

import com.mapbox.services.android.telemetry.location.AndroidLocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.location.LocationEnginePriority;
import com.mapbox.services.android.testapp.R;

public class LocationEngineActivity extends AppCompatActivity
Expand Down Expand Up @@ -69,16 +69,18 @@ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// Mock
locationEngine = new MockLocationEngine();
} else if (engineName.equals(locationEngines[2])) {
// Android
locationEngine = AndroidLocationEngine.getLocationEngine(this);
} else if (engineName.equals(locationEngines[3])) {
// Lost
locationEngine = LostLocationEngine.getLocationEngine(this);
} else if (engineName.equals(locationEngines[3])) {
} else if (engineName.equals(locationEngines[4])) {
// Google Play Services
locationEngine = GoogleLocationEngine.getLocationEngine(this);
}

if (!engineName.equals(locationEngines[0]) && locationEngine != null) {
// Not None
locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
locationEngine.addLocationEngineListener(this);
locationEngine.activate();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,22 @@
import com.mapzen.android.lost.api.LocationServices;
import com.mapzen.android.lost.api.LostApiClient;

import java.util.concurrent.CopyOnWriteArrayList;

/**
* Sample LocationEngine using the Open Source Lost library
*/
public class LostLocationEngine implements
LocationEngine, LostApiClient.ConnectionCallbacks, LocationListener {
public class LostLocationEngine extends LocationEngine implements
LostApiClient.ConnectionCallbacks, LocationListener {

private static final String LOG_TAG = LostLocationEngine.class.getSimpleName();

private static LocationEngine instance;

private Context context;
private CopyOnWriteArrayList<LocationEngineListener> locationListeners;
private LostApiClient lostApiClient;

private int priority;

public LostLocationEngine(Context context) {
super();
this.context = context;
locationListeners = new CopyOnWriteArrayList<>();
lostApiClient = new LostApiClient.Builder(context)
.addConnectionCallbacks(this)
.build();
Expand Down Expand Up @@ -68,7 +63,7 @@ public boolean isConnected() {

@Override
public void onConnected() {
for (LocationEngineListener listener : this.locationListeners) {
for (LocationEngineListener listener : locationListeners) {
listener.onConnected();
}
}
Expand All @@ -78,39 +73,16 @@ public void onConnectionSuspended() {
Log.d(LOG_TAG, "Connection suspended.");
}

@Override
public int getPriority() {
return priority;
}

@Override
public void setPriority(int priority) {
this.priority = priority;
}

@Override
public Location getLastLocation() {
if (lostApiClient.isConnected()
&& PermissionsManager.isPermissionGranted(context, PermissionsManager.FINE_LOCATION_PERMISSION)) {
if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
//noinspection MissingPermission
return LocationServices.FusedLocationApi.getLastLocation(lostApiClient);
}

return null;
}

@Override
public void addLocationEngineListener(LocationEngineListener listener) {
if (!this.locationListeners.contains(listener)) {
this.locationListeners.add(listener);
}
}

@Override
public boolean removeLocationEngineListener(LocationEngineListener listener) {
return this.locationListeners.remove(listener);
}

@Override
public void requestLocationUpdates() {
// Common params
Expand All @@ -129,8 +101,10 @@ public void requestLocationUpdates() {
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

//noinspection MissingPermission
LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this);
if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
//noinspection MissingPermission
LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this);
}
}

@Override
Expand All @@ -140,7 +114,7 @@ public void removeLocationUpdates() {

@Override
public void onLocationChanged(Location location) {
for (LocationEngineListener listener : this.locationListeners) {
for (LocationEngineListener listener : locationListeners) {
listener.onLocationChanged(location);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;

import java.util.concurrent.CopyOnWriteArrayList;

/**
* Sample LocationEngine that provides mocked locations simulating GPS updates
*/
public class MockLocationEngine implements LocationEngine {
public class MockLocationEngine extends LocationEngine {

// Mocked data
private static final int UPDATE_INTERVAL_MS = 1000;
Expand All @@ -22,21 +20,19 @@ public class MockLocationEngine implements LocationEngine {
new double[] {38.909623, -77.043413},
new double[] {38.909624, -77.043414}};

private CopyOnWriteArrayList<LocationEngineListener> locationListeners;

private Handler handler;
int currentIndex;

public MockLocationEngine() {
locationListeners = new CopyOnWriteArrayList<>();
super();
}

@Override
public void activate() {
currentIndex = 0;

// "Connection" is immediate here
for (LocationEngineListener listener : this.locationListeners) {
for (LocationEngineListener listener : locationListeners) {
listener.onConnected();
}
}
Expand All @@ -51,33 +47,11 @@ public boolean isConnected() {
return true; // Always connected
}

@Override
public int getPriority() {
return 0; // No effect
}

@Override
public void setPriority(int priority) {
// No effect
}

@Override
public Location getLastLocation() {
return getNextLocation();
}

@Override
public void addLocationEngineListener(LocationEngineListener listener) {
if (!this.locationListeners.contains(listener)) {
this.locationListeners.add(listener);
}
}

@Override
public boolean removeLocationEngineListener(LocationEngineListener listener) {
return this.locationListeners.remove(listener);
}

@Override
public void requestLocationUpdates() {
// Fake regular updates with a handler
Expand Down
1 change: 1 addition & 0 deletions mapbox/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
<string-array name="location_engines">
<item>None</item>
<item>Mock</item>
<item>Android</item>
<item>Lost</item>
<item>Google Play Services</item>
</string-array>
Expand Down
10 changes: 10 additions & 0 deletions mapbox/libandroid-telemetry/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ android {
versionCode rootProject.ext.MasVersionCode
versionName rootProject.ext.MasVersionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

// Telemetry
buildConfigField "String", "MAPBOX_EVENTS_USER_AGENT_BASE", String.format("\"MapboxEventsAndroid/%s\"", project.VERSION_NAME)
buildConfigField "String", "MAPBOX_VERSION_STRING", String.format("\"Mapbox/%s\"", project.VERSION_NAME)
}

compileOptions {
Expand All @@ -29,6 +33,12 @@ dependencies {
// Android Support libraries
compile 'com.android.support:appcompat-v7:25.1.0'

// Timber for logging
compile 'com.jakewharton.timber:timber:4.5.0'

// OkHttp for network requests
compile 'com.squareup.okhttp3:okhttp:3.5.0'

// Testing
testCompile 'junit:junit:4.12'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
Expand Down
7 changes: 1 addition & 6 deletions mapbox/libandroid-telemetry/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mapbox.services.android.telemetry">

<application android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
>

</application>

android:supportsRtl="true" />
</manifest>
Loading

0 comments on commit 6d56821

Please sign in to comment.