diff options
author | Andrey Li <andrey.li@mapbox.com> | 2018-10-26 09:08:24 -0700 |
---|---|---|
committer | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2018-11-29 19:26:21 +0100 |
commit | 2c70f4b6dc7d9c9c67f7a78e4290335f137392d9 (patch) | |
tree | 11a10449edc98e736bc205007e66126eda704d4e /platform/android/MapboxGLAndroidSDK/src/main/java | |
parent | c9add3646ea80654a3e2a2e81d750a92f7c8e999 (diff) | |
download | qtlocation-mapboxgl-2c70f4b6dc7d9c9c67f7a78e4290335f137392d9.tar.gz |
[android] Initial integration with liblocation 1.0.0 and telemetry 4.0.0, bumped gms to 16.0.0
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java | 105 |
1 files changed, 63 insertions, 42 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java index fc125ef03a..d0b0bb733d 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.hardware.SensorManager; import android.location.Location; +import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresPermission; @@ -11,9 +12,10 @@ import android.support.annotation.StyleRes; import android.view.WindowManager; import com.mapbox.android.core.location.LocationEngine; -import com.mapbox.android.core.location.LocationEngineListener; -import com.mapbox.android.core.location.LocationEnginePriority; +import com.mapbox.android.core.location.LocationEngineCallback; import com.mapbox.android.core.location.LocationEngineProvider; +import com.mapbox.android.core.location.LocationEngineRequest; +import com.mapbox.android.core.location.LocationEngineResult; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdate; @@ -27,6 +29,9 @@ import com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveListener; import com.mapbox.mapboxsdk.maps.MapboxMap.OnMapClickListener; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; @@ -59,10 +64,10 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_T * this plugin work as expected. * <p> * This component offers a default, built-in {@link LocationEngine} with some of the activation methods. - * This engine will be obtained by {@link LocationEngineProvider#obtainBestLocationEngineAvailable} which defaults - * to the {@link com.mapbox.android.core.location.AndroidLocationEngine}. If you'd like to utilize Google Play Services + * This engine will be obtained by {@link LocationEngineProvider#getBestLocationEngine(Context, boolean)} which defaults + * to the {@link com.mapbox.android.core.location.MapboxFusedLocationEngineImpl}. If you'd like to utilize Google Play Services * for more precise location updates, simply add the Google Play Location Services dependency in your build script. - * This will make the default engine the {@link com.mapbox.android.core.location.GoogleLocationEngine} instead. + * This will make the default engine the {@link com.mapbox.android.core.location.GoogleLocationEngineImpl} instead. * <p> * For location puck animation purposes, like navigation, * we recommend limiting the maximum zoom level of the map for the best user experience. @@ -71,6 +76,8 @@ import static com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_T */ public final class LocationComponent { private static final String TAG = "Mbgl-LocationComponent"; + private static final long DEFAULT_INTERVAL_MILLIS = 1000; + private static final long DEFAULT_FASTEST_INTERVAL_MILLIS = 1000; @NonNull private final MapboxMap mapboxMap; @@ -489,19 +496,14 @@ public final class LocationComponent { // If internal location engines being used, extra steps need to be taken to deconstruct the // instance. if (usingInternalLocationEngine) { - this.locationEngine.removeLocationUpdates(); - this.locationEngine.deactivate(); usingInternalLocationEngine = false; } - this.locationEngine.removeLocationEngineListener(locationEngineListener); + this.locationEngine.removeLocationUpdates(locationEngineListener); this.locationEngine = null; } if (locationEngine != null) { this.locationEngine = locationEngine; - if (isEnabled) { - this.locationEngine.addLocationEngineListener(locationEngineListener); - } } } @@ -544,11 +546,31 @@ public final class LocationComponent { @Nullable @RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION}) public Location getLastKnownLocation() { - Location location = locationEngine != null ? locationEngine.getLastLocation() : null; - if (location == null) { - location = lastLocation; + if (locationEngine == null) { + return null; + } + // TODO: decide if we want to change signature of this method, for now make it work as is + final AtomicReference<LocationEngineResult> resultRef = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(1); + locationEngine.getLastLocation(new LocationEngineCallback<LocationEngineResult>() { + @Override + public void onSuccess(LocationEngineResult result) { + resultRef.set(result); + latch.countDown(); + } + + @Override + public void onFailure(@NonNull Exception exception) { + // TODO: log exception + } + }); + try { + latch.await(2, TimeUnit.SECONDS); + } catch (InterruptedException ie) { + ie.printStackTrace(); } - return location; + LocationEngineResult result = resultRef.get(); + return result != null ? result.getLastLocation() : null; } /** @@ -690,9 +712,6 @@ public final class LocationComponent { * Internal use. */ public void onDestroy() { - if (locationEngine != null && usingInternalLocationEngine) { - locationEngine.deactivate(); - } } /** @@ -731,9 +750,13 @@ public final class LocationComponent { if (isEnabled) { if (locationEngine != null) { - locationEngine.addLocationEngineListener(locationEngineListener); - if (locationEngine.isConnected() && usingInternalLocationEngine) { - locationEngine.requestLocationUpdates(); + if (usingInternalLocationEngine) { + try { + locationEngine.requestLocationUpdates(getLocationRequst(DEFAULT_INTERVAL_MILLIS), + locationEngineListener, Looper.getMainLooper()); + } catch (SecurityException se) { + se.printStackTrace(); + } } } setCameraMode(locationCameraController.getCameraMode()); @@ -754,9 +777,8 @@ public final class LocationComponent { locationAnimatorCoordinator.cancelAllAnimations(); if (locationEngine != null) { if (usingInternalLocationEngine) { - locationEngine.removeLocationUpdates(); + locationEngine.removeLocationUpdates(locationEngineListener); } - locationEngine.removeLocationEngineListener(locationEngineListener); } mapboxMap.removeOnCameraMoveListener(onCameraMoveListener); mapboxMap.removeOnCameraIdleListener(onCameraIdleListener); @@ -801,19 +823,17 @@ public final class LocationComponent { private void initializeLocationEngine(@NonNull Context context) { if (this.locationEngine != null) { - if (usingInternalLocationEngine) { - this.locationEngine.removeLocationUpdates(); - this.locationEngine.deactivate(); - } - this.locationEngine.removeLocationEngineListener(locationEngineListener); + this.locationEngine.removeLocationUpdates(locationEngineListener); } - usingInternalLocationEngine = true; - locationEngine = new LocationEngineProvider(context).obtainBestLocationEngineAvailable(); - locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY); - locationEngine.setFastestInterval(1000); - locationEngine.addLocationEngineListener(locationEngineListener); - locationEngine.activate(); + locationEngine = LocationEngineProvider.getBestLocationEngine(context, false); + } + + private static LocationEngineRequest getLocationRequst(long interval) { + return new LocationEngineRequest.Builder(interval) + .setFastestInterval(DEFAULT_FASTEST_INTERVAL_MILLIS) + .setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY) + .build(); } private void enableLocationComponent() { @@ -986,18 +1006,19 @@ public final class LocationComponent { }; @NonNull - private LocationEngineListener locationEngineListener = new LocationEngineListener() { + private LocationEngineCallback<LocationEngineResult> locationEngineListener = + new LocationEngineCallback<LocationEngineResult>() { @Override - @SuppressWarnings( {"MissingPermission"}) - public void onConnected() { - if (usingInternalLocationEngine && isLayerReady && isEnabled) { - locationEngine.requestLocationUpdates(); + public void onSuccess(LocationEngineResult result) { + Location location = result.getLastLocation(); + if (location != null) { + updateLocation(location, false); } } @Override - public void onLocationChanged(Location location) { - updateLocation(location, false); + public void onFailure(@NonNull Exception exception) { + // TODO: handle error } }; @@ -1019,4 +1040,4 @@ public final class LocationComponent { } } }; -} +}
\ No newline at end of file |