diff --git a/CHANGELOG.md b/CHANGELOG.md index fd44e6e14..ab7b07511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/liblocation/src/main/java/com/mapbox/android/core/permissions/PermissionsManager.java b/liblocation/src/main/java/com/mapbox/android/core/permissions/PermissionsManager.java index 94f42f5ae..660aeb359 100644 --- a/liblocation/src/main/java/com/mapbox/android/core/permissions/PermissionsManager.java +++ b/liblocation/src/main/java/com/mapbox/android/core/permissions/PermissionsManager.java @@ -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; } @@ -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; + } } diff --git a/libtelemetry/src/full/java/com/mapbox/android/telemetry/MapboxTelemetry.java b/libtelemetry/src/full/java/com/mapbox/android/telemetry/MapboxTelemetry.java index bf10bafcf..dbe06270b 100644 --- a/libtelemetry/src/full/java/com/mapbox/android/telemetry/MapboxTelemetry.java +++ b/libtelemetry/src/full/java/com/mapbox/android/telemetry/MapboxTelemetry.java @@ -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; @@ -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; } diff --git a/libtelemetry/src/main/java/com/mapbox/android/telemetry/AppUserTurnstile.java b/libtelemetry/src/main/java/com/mapbox/android/telemetry/AppUserTurnstile.java index 1b14df4c8..63806d5b8 100644 --- a/libtelemetry/src/main/java/com/mapbox/android/telemetry/AppUserTurnstile.java +++ b/libtelemetry/src/main/java/com/mapbox/android/telemetry/AppUserTurnstile.java @@ -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); @@ -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; diff --git a/libtelemetry/src/test/java/com/mapbox/android/telemetry/AppUserTurnstileTest.java b/libtelemetry/src/test/java/com/mapbox/android/telemetry/AppUserTurnstileTest.java index 0a0b97af2..6ba75e688 100644 --- a/libtelemetry/src/test/java/com/mapbox/android/telemetry/AppUserTurnstileTest.java +++ b/libtelemetry/src/test/java/com/mapbox/android/telemetry/AppUserTurnstileTest.java @@ -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); diff --git a/libtelemetry/src/test/java/com/mapbox/android/telemetry/SchemaTest.java b/libtelemetry/src/test/java/com/mapbox/android/telemetry/SchemaTest.java index c171c5fe6..b4f801036 100644 --- a/libtelemetry/src/test/java/com/mapbox/android/telemetry/SchemaTest.java +++ b/libtelemetry/src/test/java/com/mapbox/android/telemetry/SchemaTest.java @@ -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 diff --git a/libtelemetry/src/test/java/com/mapbox/android/telemetry/TelemetryClientAppUserTurnstileEventTest.java b/libtelemetry/src/test/java/com/mapbox/android/telemetry/TelemetryClientAppUserTurnstileEventTest.java index 436868499..4d951b29b 100644 --- a/libtelemetry/src/test/java/com/mapbox/android/telemetry/TelemetryClientAppUserTurnstileEventTest.java +++ b/libtelemetry/src/test/java/com/mapbox/android/telemetry/TelemetryClientAppUserTurnstileEventTest.java @@ -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 theAppUserTurnstile = obtainEvents(anAppUserTurnstile); Callback mockedCallback = mock(Callback.class); enqueueMockResponse();