Skip to content

Commit

Permalink
[telemetry] Send accuracy authorization with AppUserTurnstile event.
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Tarasov committed Jun 3, 2021
1 parent 68c2c9c commit 7282459
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Mapbox welcomes participation and contributions from everyone.
### v7.0.4

- [telemetry] Android 12 compartibility fixes.
- [telemetry] Send accuracy authorization with AppUserTurnstile event.

### v7.0.3

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ public class PermissionsManager {

private PermissionsListener listener;

/**
* Type of accuracy granted by a user to the app.
*/
public enum AccuracyAuthorization {
/** No location permission granted. */
NONE,
/** Provides the location accuracy that the ACCESS_FINE_LOCATION permission provides. */
PRECISE,
/** Provides the location accuracy that the ACCESS_COARSE_LOCATION permission provides. */
APPROXIMATE,
}

public PermissionsManager(PermissionsListener listener) {
this.listener = listener;
}
Expand Down Expand Up @@ -149,4 +161,22 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in
// Ignored
}
}

/**
* Returns the type of accuracy given by a user
* to the application.
*
* @param context the application context
* @return the type of accuracy authorization
* @see AccuracyAuthorization
*/
public static AccuracyAuthorization accuracyAuthorization(Context context) {
if (isFineLocationPermissionGranted(context)) {
return AccuracyAuthorization.PRECISE;
}
if (isCoarseLocationPermissionGranted(context)) {
return AccuracyAuthorization.APPROXIMATE;
}
return AccuracyAuthorization.NONE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;

import com.mapbox.android.core.permissions.PermissionsManager;
import com.mapbox.android.telemetry.errors.ErrorReporterEngine;

import java.io.IOException;
Expand Down Expand Up @@ -100,7 +101,25 @@ public void onTaskRemoved() {
unregisterTelemetry();
}

private void addAccuracyAuthorization(AppUserTurnstile appUserTurnstile) {
PermissionsManager.AccuracyAuthorization authorization =
PermissionsManager.accuracyAuthorization(applicationContext);
switch (authorization) {
case PRECISE:
appUserTurnstile.setAccuracyAuthorization("full");
break;
case APPROXIMATE:
appUserTurnstile.setAccuracyAuthorization("reduced");
break;
default:
}
}

public boolean push(Event event) {
if (event instanceof AppUserTurnstile) {
addAccuracyAuthorization((AppUserTurnstile) event);
}

if (sendEventIfWhitelisted(event)) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public class AppUserTurnstile extends Event implements Parcelable {
private final String operatingSystem;
@SerializedName("skuId")
private String skuId;
@SerializedName("accuracyAuthorization")
private String accuracyAuthorization;

public AppUserTurnstile(String sdkIdentifier, String sdkVersion) {
this(sdkIdentifier, sdkVersion, true);
Expand Down Expand Up @@ -70,6 +72,15 @@ public void setSkuId(@NonNull String skuId) {
this.skuId = skuId;
}

@Nullable
public String getAccuracyAuthorization() {
return this.accuracyAuthorization;
}

public void setAccuracyAuthorization(@NonNull String fullOrReduced) {
this.accuracyAuthorization = fullOrReduced;
}

@Override
Type obtainType() {
return Type.TURNSTILE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,20 @@ public void verifyValidSkuId() {
assertEquals(randomSkuId, anAppUserTurnstileEvent.getSkuId());
}

@Test
public void verifyDefaultAccuracyAuthentication() {
AppUserTurnstile anAppUserTurnstileEvent = (AppUserTurnstile)obtainAnAppUserTurnstileEvent();
assertNull(anAppUserTurnstileEvent.getAccuracyAuthorization());
}

@Test
public void verifyEmptySetAccuracyAuthorization() {
AppUserTurnstile anAppUserTurnstileEvent = (AppUserTurnstile)obtainAnAppUserTurnstileEvent();
String full = "full";
anAppUserTurnstileEvent.setAccuracyAuthorization(full);
assertEquals(full, anAppUserTurnstileEvent.getAccuracyAuthorization());
}

private Event obtainAnAppUserTurnstileEvent() {
Context mockedContext = mock(Context.class);
SharedPreferences mockedSharedPreferences = mock(SharedPreferences.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class SchemaTest {
**/
private String[] additionalLocationProperties =
{"speed", "course", "floor", "speedAccuracy", "courseAccuracy", "verticalAccuracy", "config",
"approximate", "accuracyAuthorization", "version"};
"approximate", "version"};

/**
* Properties in Vision Schema that are added in backend
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public void sendsTheCorrectBodyPostingAppUserTurnstileEvent() throws Exception {
TelemetryClient telemetryClient = obtainATelemetryClient("anyAccessToken", anyUserAgent,
anyUserAgent , mockedContext);
Event anAppUserTurnstile = new AppUserTurnstile("anySdkIdentifier", "anySdkVersion", false);
((AppUserTurnstile)anAppUserTurnstile).setAccuracyAuthorization("full");
List<Event> theAppUserTurnstile = obtainEvents(anAppUserTurnstile);
Callback mockedCallback = mock(Callback.class);
enqueueMockResponse();
Expand Down

0 comments on commit 7282459

Please sign in to comment.