Skip to content

Commit 6d56821

Browse files
authored
Telemetry module (#282)
* 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
1 parent 7af5094 commit 6d56821

25 files changed

Lines changed: 1835 additions & 131 deletions

File tree

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ publish-android:
4848
cd mapbox; ./gradlew :libandroid-services:uploadArchives
4949
cd mapbox; ./gradlew :libandroid-ui:uploadArchives
5050

51+
publish-local:
52+
# This publishes to ~/.m2/repository/com/mapbox/mapboxsdk
53+
cd mapbox; ./gradlew :libjava-core:install
54+
cd mapbox; ./gradlew :libjava-geojson:install
55+
cd mapbox; ./gradlew :libjava-services:install
56+
cd mapbox; ./gradlew :libjava-services-rx:install
57+
# cd mapbox; ./gradlew :libandroid-telemetry:install
58+
# cd mapbox; ./gradlew :libandroid-services:install
59+
# cd mapbox; ./gradlew :libandroid-ui:install
60+
5161
dex-count:
5262
cd mapbox; ./gradlew countDebugDexMethods
5363
cd mapbox; ./gradlew countReleaseDexMethods

mapbox/app/src/main/java/com/mapbox/services/android/testapp/location/GoogleLocationEngine.java

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,22 @@
1717
import com.mapbox.services.android.telemetry.location.LocationEnginePriority;
1818
import com.mapbox.services.android.telemetry.permissions.PermissionsManager;
1919

20-
import java.util.concurrent.CopyOnWriteArrayList;
21-
2220
/**
2321
* Sample LocationEngine using Google Play Services
2422
*/
25-
public class GoogleLocationEngine implements LocationEngine,
23+
public class GoogleLocationEngine extends LocationEngine implements
2624
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
2725

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

3028
private static LocationEngine instance;
3129

3230
private Context context;
33-
private CopyOnWriteArrayList<LocationEngineListener> locationListeners;
3431
private GoogleApiClient googleApiClient;
3532

36-
private int priority;
37-
3833
public GoogleLocationEngine(Context context) {
34+
super();
3935
this.context = context;
40-
locationListeners = new CopyOnWriteArrayList<>();
4136
googleApiClient = new GoogleApiClient.Builder(context)
4237
.addConnectionCallbacks(this)
4338
.addOnConnectionFailedListener(this)
@@ -74,7 +69,7 @@ public boolean isConnected() {
7469

7570
@Override
7671
public void onConnected(@Nullable Bundle bundle) {
77-
for (LocationEngineListener listener : this.locationListeners) {
72+
for (LocationEngineListener listener : locationListeners) {
7873
listener.onConnected();
7974
}
8075
}
@@ -89,39 +84,16 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
8984
Log.d(LOG_TAG, "Connection failed:" + connectionResult.getErrorMessage());
9085
}
9186

92-
@Override
93-
public int getPriority() {
94-
return priority;
95-
}
96-
97-
@Override
98-
public void setPriority(int priority) {
99-
this.priority = priority;
100-
}
101-
10287
@Override
10388
public Location getLastLocation() {
104-
if (googleApiClient.isConnected()
105-
&& PermissionsManager.isPermissionGranted(context, PermissionsManager.FINE_LOCATION_PERMISSION)) {
89+
if (googleApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
10690
//noinspection MissingPermission
10791
return LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
10892
}
10993

11094
return null;
11195
}
11296

113-
@Override
114-
public void addLocationEngineListener(LocationEngineListener listener) {
115-
if (!this.locationListeners.contains(listener)) {
116-
this.locationListeners.add(listener);
117-
}
118-
}
119-
120-
@Override
121-
public boolean removeLocationEngineListener(LocationEngineListener listener) {
122-
return this.locationListeners.remove(listener);
123-
}
124-
12597
@Override
12698
public void requestLocationUpdates() {
12799
// Common params
@@ -140,8 +112,10 @@ public void requestLocationUpdates() {
140112
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
141113
}
142114

143-
//noinspection MissingPermission
144-
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this);
115+
if (googleApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
116+
//noinspection MissingPermission
117+
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this);
118+
}
145119
}
146120

147121
@Override
@@ -151,7 +125,7 @@ public void removeLocationUpdates() {
151125

152126
@Override
153127
public void onLocationChanged(Location location) {
154-
for (LocationEngineListener listener : this.locationListeners) {
128+
for (LocationEngineListener listener : locationListeners) {
155129
listener.onLocationChanged(location);
156130
}
157131
}

mapbox/app/src/main/java/com/mapbox/services/android/testapp/location/LocationEngineActivity.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package com.mapbox.services.android.testapp.location;
22

33
import android.location.Location;
4-
import android.support.v7.app.AppCompatActivity;
54
import android.os.Bundle;
5+
import android.support.v7.app.AppCompatActivity;
66
import android.util.Log;
77
import android.view.View;
88
import android.widget.AdapterView;
99
import android.widget.ArrayAdapter;
1010
import android.widget.Spinner;
1111
import android.widget.TextView;
1212

13+
import com.mapbox.services.android.telemetry.location.AndroidLocationEngine;
1314
import com.mapbox.services.android.telemetry.location.LocationEngine;
1415
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
15-
import com.mapbox.services.android.telemetry.location.LocationEnginePriority;
1616
import com.mapbox.services.android.testapp.R;
1717

1818
public class LocationEngineActivity extends AppCompatActivity
@@ -69,16 +69,18 @@ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
6969
// Mock
7070
locationEngine = new MockLocationEngine();
7171
} else if (engineName.equals(locationEngines[2])) {
72+
// Android
73+
locationEngine = AndroidLocationEngine.getLocationEngine(this);
74+
} else if (engineName.equals(locationEngines[3])) {
7275
// Lost
7376
locationEngine = LostLocationEngine.getLocationEngine(this);
74-
} else if (engineName.equals(locationEngines[3])) {
77+
} else if (engineName.equals(locationEngines[4])) {
7578
// Google Play Services
7679
locationEngine = GoogleLocationEngine.getLocationEngine(this);
7780
}
7881

7982
if (!engineName.equals(locationEngines[0]) && locationEngine != null) {
8083
// Not None
81-
locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
8284
locationEngine.addLocationEngineListener(this);
8385
locationEngine.activate();
8486
}

mapbox/app/src/main/java/com/mapbox/services/android/testapp/location/LostLocationEngine.java

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,22 @@
1313
import com.mapzen.android.lost.api.LocationServices;
1414
import com.mapzen.android.lost.api.LostApiClient;
1515

16-
import java.util.concurrent.CopyOnWriteArrayList;
17-
1816
/**
1917
* Sample LocationEngine using the Open Source Lost library
2018
*/
21-
public class LostLocationEngine implements
22-
LocationEngine, LostApiClient.ConnectionCallbacks, LocationListener {
19+
public class LostLocationEngine extends LocationEngine implements
20+
LostApiClient.ConnectionCallbacks, LocationListener {
2321

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

2624
private static LocationEngine instance;
2725

2826
private Context context;
29-
private CopyOnWriteArrayList<LocationEngineListener> locationListeners;
3027
private LostApiClient lostApiClient;
3128

32-
private int priority;
33-
3429
public LostLocationEngine(Context context) {
30+
super();
3531
this.context = context;
36-
locationListeners = new CopyOnWriteArrayList<>();
3732
lostApiClient = new LostApiClient.Builder(context)
3833
.addConnectionCallbacks(this)
3934
.build();
@@ -68,7 +63,7 @@ public boolean isConnected() {
6863

6964
@Override
7065
public void onConnected() {
71-
for (LocationEngineListener listener : this.locationListeners) {
66+
for (LocationEngineListener listener : locationListeners) {
7267
listener.onConnected();
7368
}
7469
}
@@ -78,39 +73,16 @@ public void onConnectionSuspended() {
7873
Log.d(LOG_TAG, "Connection suspended.");
7974
}
8075

81-
@Override
82-
public int getPriority() {
83-
return priority;
84-
}
85-
86-
@Override
87-
public void setPriority(int priority) {
88-
this.priority = priority;
89-
}
90-
9176
@Override
9277
public Location getLastLocation() {
93-
if (lostApiClient.isConnected()
94-
&& PermissionsManager.isPermissionGranted(context, PermissionsManager.FINE_LOCATION_PERMISSION)) {
78+
if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
9579
//noinspection MissingPermission
9680
return LocationServices.FusedLocationApi.getLastLocation(lostApiClient);
9781
}
9882

9983
return null;
10084
}
10185

102-
@Override
103-
public void addLocationEngineListener(LocationEngineListener listener) {
104-
if (!this.locationListeners.contains(listener)) {
105-
this.locationListeners.add(listener);
106-
}
107-
}
108-
109-
@Override
110-
public boolean removeLocationEngineListener(LocationEngineListener listener) {
111-
return this.locationListeners.remove(listener);
112-
}
113-
11486
@Override
11587
public void requestLocationUpdates() {
11688
// Common params
@@ -129,8 +101,10 @@ public void requestLocationUpdates() {
129101
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
130102
}
131103

132-
//noinspection MissingPermission
133-
LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this);
104+
if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context)) {
105+
//noinspection MissingPermission
106+
LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this);
107+
}
134108
}
135109

136110
@Override
@@ -140,7 +114,7 @@ public void removeLocationUpdates() {
140114

141115
@Override
142116
public void onLocationChanged(Location location) {
143-
for (LocationEngineListener listener : this.locationListeners) {
117+
for (LocationEngineListener listener : locationListeners) {
144118
listener.onLocationChanged(location);
145119
}
146120
}

mapbox/app/src/main/java/com/mapbox/services/android/testapp/location/MockLocationEngine.java

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@
66
import com.mapbox.services.android.telemetry.location.LocationEngine;
77
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
88

9-
import java.util.concurrent.CopyOnWriteArrayList;
10-
119
/**
1210
* Sample LocationEngine that provides mocked locations simulating GPS updates
1311
*/
14-
public class MockLocationEngine implements LocationEngine {
12+
public class MockLocationEngine extends LocationEngine {
1513

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

25-
private CopyOnWriteArrayList<LocationEngineListener> locationListeners;
26-
2723
private Handler handler;
2824
int currentIndex;
2925

3026
public MockLocationEngine() {
31-
locationListeners = new CopyOnWriteArrayList<>();
27+
super();
3228
}
3329

3430
@Override
3531
public void activate() {
3632
currentIndex = 0;
3733

3834
// "Connection" is immediate here
39-
for (LocationEngineListener listener : this.locationListeners) {
35+
for (LocationEngineListener listener : locationListeners) {
4036
listener.onConnected();
4137
}
4238
}
@@ -51,33 +47,11 @@ public boolean isConnected() {
5147
return true; // Always connected
5248
}
5349

54-
@Override
55-
public int getPriority() {
56-
return 0; // No effect
57-
}
58-
59-
@Override
60-
public void setPriority(int priority) {
61-
// No effect
62-
}
63-
6450
@Override
6551
public Location getLastLocation() {
6652
return getNextLocation();
6753
}
6854

69-
@Override
70-
public void addLocationEngineListener(LocationEngineListener listener) {
71-
if (!this.locationListeners.contains(listener)) {
72-
this.locationListeners.add(listener);
73-
}
74-
}
75-
76-
@Override
77-
public boolean removeLocationEngineListener(LocationEngineListener listener) {
78-
return this.locationListeners.remove(listener);
79-
}
80-
8155
@Override
8256
public void requestLocationUpdates() {
8357
// Fake regular updates with a handler

mapbox/app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
<string-array name="location_engines">
9090
<item>None</item>
9191
<item>Mock</item>
92+
<item>Android</item>
9293
<item>Lost</item>
9394
<item>Google Play Services</item>
9495
</string-array>

mapbox/libandroid-telemetry/build.gradle

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ android {
1010
versionCode rootProject.ext.MasVersionCode
1111
versionName rootProject.ext.MasVersionName
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13+
14+
// Telemetry
15+
buildConfigField "String", "MAPBOX_EVENTS_USER_AGENT_BASE", String.format("\"MapboxEventsAndroid/%s\"", project.VERSION_NAME)
16+
buildConfigField "String", "MAPBOX_VERSION_STRING", String.format("\"Mapbox/%s\"", project.VERSION_NAME)
1317
}
1418

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

36+
// Timber for logging
37+
compile 'com.jakewharton.timber:timber:4.5.0'
38+
39+
// OkHttp for network requests
40+
compile 'com.squareup.okhttp3:okhttp:3.5.0'
41+
3242
// Testing
3343
testCompile 'junit:junit:4.12'
3444
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.mapbox.services.android.telemetry">
3-
43
<application android:allowBackup="true"
54
android:label="@string/app_name"
6-
android:supportsRtl="true"
7-
>
8-
9-
</application>
10-
5+
android:supportsRtl="true" />
116
</manifest>

0 commit comments

Comments
 (0)