summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkevin <kevin.li@mapbox.com>2019-06-25 17:20:04 +0800
committerkevin <kevin.li@mapbox.com>2019-06-26 15:16:49 +0800
commitce08efffc0b89f38b9768eb05c666e192af21793 (patch)
tree7b1973fcaa1100ccded5c555fa69ea58f067232f
parent45ec7709f36ab7ffed4260f9b3e2f0b8bab42c93 (diff)
downloadqtlocation-mapboxgl-ce08efffc0b89f38b9768eb05c666e192af21793.tar.gz
Add shift in CameraPosition
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java12
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java6
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml11
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt217
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml1
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml1
6 files changed, 242 insertions, 6 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
index f44c0f1904..7c297bd0f4 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
@@ -8,6 +8,8 @@ import android.support.annotation.Keep;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+
+import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -168,7 +170,7 @@ public final class CameraPosition implements Parcelable {
* Builder for composing CameraPosition objects.
*/
public static final class Builder {
-
+ private boolean needShift = true;
private double bearing = -1;
@Nullable
private LatLng target = null;
@@ -221,6 +223,8 @@ public final class CameraPosition implements Parcelable {
*/
public Builder(@Nullable CameraUpdateFactory.CameraPositionUpdate update) {
super();
+ // The location in update is shifted before, so no need to shift again.
+ needShift = false;
if (update != null) {
bearing = update.getBearing();
target = update.getTarget();
@@ -236,6 +240,8 @@ public final class CameraPosition implements Parcelable {
*/
public Builder(@Nullable CameraUpdateFactory.ZoomUpdate update) {
super();
+ // The location in update is shifted before, so no need to shift again.
+ needShift = false;
if (update != null) {
this.zoom = update.getZoom();
}
@@ -312,6 +318,10 @@ public final class CameraPosition implements Parcelable {
* @return CameraPosition
*/
public CameraPosition build() {
+ if (needShift && target != null) {
+ Point point = Point.fromLngLat(target.getLongitude(), target.getLatitude());
+ this.target = new LatLng(point.latitude(), point.longitude());
+ }
return new CameraPosition(target, zoom, tilt, bearing);
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java
index c48dfc5e0a..6337287770 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java
@@ -9,7 +9,6 @@ import android.support.annotation.VisibleForTesting;
import android.util.SparseArray;
import android.view.animation.LinearInterpolator;
-import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.log.Logger;
@@ -91,10 +90,7 @@ final class LocationAnimatorCoordinator {
targetCameraBearing = checkGpsNorth(isGpsNorth, targetCameraBearing);
updateLayerAnimators(previousLayerLatLng, targetLatLng, previousLayerBearing, targetLayerBearing);
-
- Point p = Point.fromLngLat(targetLatLng.getLongitude(), targetLatLng.getLatitude());
- updateCameraAnimators(previousCameraLatLng, previousCameraBearing, new LatLng(p.latitude(),p.longitude()),
- targetCameraBearing);
+ updateCameraAnimators(previousCameraLatLng, previousCameraBearing, targetLatLng, targetCameraBearing);
boolean snap = immediateAnimation(projection, previousCameraLatLng, targetLatLng)
|| immediateAnimation(projection, previousLayerLatLng, targetLatLng);
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
index bb2bef35fb..206d036cf5 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
@@ -878,6 +878,17 @@
android:value=".activity.FeatureOverviewActivity" />
</activity>
<activity
+ android:name=".activity.location.LocationShiftActivity"
+ android:description="@string/description_location_shift"
+ android:label="@string/activity_location_shift">
+ <meta-data
+ android:name="@string/category"
+ android:value="@string/category_location" />
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".activity.FeatureOverviewActivity" />
+ </activity>
+ <activity
android:name=".activity.location.ManualLocationUpdatesActivity"
android:description="@string/description_location_manual"
android:label="@string/activity_location_manual">
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt
new file mode 100644
index 0000000000..3aade2c529
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt
@@ -0,0 +1,217 @@
+package com.mapbox.mapboxsdk.testapp.activity.location
+
+import android.annotation.SuppressLint
+import android.app.Fragment
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import android.widget.Toast
+import com.mapbox.android.core.location.LocationEngineCallback
+import com.mapbox.android.core.location.LocationEngineResult
+import com.mapbox.android.core.permissions.PermissionsListener
+import com.mapbox.android.core.permissions.PermissionsManager
+import com.mapbox.geojson.Point
+import com.mapbox.geojson.shifter.CoordinateShifter
+import com.mapbox.geojson.shifter.CoordinateShifterManager
+import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions
+import com.mapbox.mapboxsdk.location.modes.CameraMode.TRACKING
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.testapp.R
+import kotlinx.android.synthetic.main.activity_location_layer_fragment.*
+import java.util.ArrayList
+
+class LocationShiftActivity : AppCompatActivity() {
+ private lateinit var permissionsManager: PermissionsManager
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_location_layer_fragment)
+
+ fab.setOnClickListener {
+ val fragment = fragmentManager.findFragmentByTag(EmptyFragment.TAG)
+ if (fragment == null) {
+ fragmentManager
+ .beginTransaction()
+ .replace(R.id.container, EmptyFragment.newInstance(), EmptyFragment.TAG)
+ .addToBackStack("transaction2")
+ .commit()
+ } else {
+ this.onBackPressed()
+ }
+ }
+ CoordinateShifterManager.setCoordinateShifter(coordinateShifter())
+
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+ if (PermissionsManager.areLocationPermissionsGranted(this)) {
+ if (savedInstanceState == null) {
+ fragmentManager
+ .beginTransaction()
+ .replace(R.id.container, LocationFragment.newInstance(), LocationFragment.TAG)
+ .commit()
+ }
+ } else {
+ permissionsManager = PermissionsManager(object : PermissionsListener {
+ override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
+ Toast.makeText(this@LocationShiftActivity, "You need to accept location permissions.",
+ Toast.LENGTH_SHORT).show()
+ }
+
+ override fun onPermissionResult(granted: Boolean) {
+ if (granted) {
+ if (savedInstanceState == null) {
+ fragmentManager
+ .beginTransaction()
+ .replace(R.id.container, LocationFragment.newInstance(), LocationFragment.TAG)
+ .commit()
+ }
+ } else {
+ finish()
+ }
+ }
+ })
+ permissionsManager.requestLocationPermissions(this)
+ }
+ }
+
+ private fun coordinateShifter(): CoordinateShifter {
+ return object : CoordinateShifter {
+ override fun shiftLonLat(lon: Double, lat: Double): List<Double> {
+ return shift(lon, lat)
+ }
+
+ override fun shiftLonLatAlt(lon: Double, lat: Double, altitude: Double): List<Double> {
+ val shiftedLongLat = shift(lon, lat)
+ shiftedLongLat.add(altitude)
+ return shiftedLongLat
+ }
+
+ override fun unshiftPoint(shiftedPoint: Point): List<Double> {
+ val shiftedCoordinates = ArrayList<Double>(2)
+ shiftedCoordinates.add(shiftedPoint.longitude())
+ shiftedCoordinates.add(shiftedPoint.latitude())
+ return shiftedCoordinates
+ }
+
+ override fun unshiftPoint(shiftedCoordinates: List<Double>): List<Double> {
+ // Left empty on purpose
+ return shiftedCoordinates
+ }
+
+ private fun shift(lon: Double, lat: Double): MutableList<Double> {
+ val shiftedCoordinates = ArrayList<Double>(3)
+ val shiftedLon = lon + 0.5
+ val shiftedLat = lat + 0.5
+ shiftedCoordinates.add(shiftedLon)
+ shiftedCoordinates.add(shiftedLat)
+ return shiftedCoordinates
+ }
+ }
+ }
+
+ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ }
+
+ class LocationFragment : Fragment(), LocationEngineCallback<LocationEngineResult> {
+ companion object {
+ const val TAG = "LFragment"
+ fun newInstance(): LocationFragment {
+ return LocationFragment()
+ }
+ }
+
+ private lateinit var mapView: MapView
+ private lateinit var mapboxMap: MapboxMap
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ mapView = MapView(inflater.context)
+ return mapView
+ }
+
+ @SuppressLint("MissingPermission")
+ override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync {
+ mapboxMap = it
+ mapboxMap.setMinZoomPreference(10.0)
+ it.setStyle(Style.MAPBOX_STREETS) { style ->
+ val component = mapboxMap.locationComponent
+
+ component.activateLocationComponent(LocationComponentActivationOptions
+ .builder(activity, style)
+ .useDefaultLocationEngine(true)
+ .build())
+
+ component.isLocationComponentEnabled = true
+ component.locationEngine?.getLastLocation(this)
+ component.cameraMode = TRACKING
+ }
+ }
+ }
+
+ override fun onSuccess(result: LocationEngineResult?) {
+// mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(result?.lastLocation), 12.0))
+ }
+
+ override fun onFailure(exception: Exception) {
+ //noop
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ mapView.onDestroy()
+ CoordinateShifterManager.setCoordinateShifter(null)
+ }
+ }
+
+ class EmptyFragment : Fragment() {
+ companion object {
+ const val TAG = "EmptyFragment"
+ fun newInstance(): EmptyFragment {
+ return EmptyFragment()
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
+ val textView = TextView(inflater?.context)
+ textView.text = "This is an empty Fragment"
+ return textView
+ }
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
index 684220f2c4..24727fd74b 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
@@ -77,6 +77,7 @@
<string name="description_location_map_change">Change map\'s style while location is displayed</string>
<string name="description_location_modes">Showcases location render and tracking modes</string>
<string name="description_location_fragment">Uses LocationComponent in a Fragment</string>
+ <string name="description_location_shift">Uses LocationComponent with shift</string>
<string name="description_location_manual">Force location updates and don\'t rely on the engine</string>
<string name="description_location_activation_builder">Use LocationComponentActivationOptions to set options</string>
<string name="description_recyclerview_textureview">Show multiple TextureView MapViews as recyclerView items</string>
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
index 027198c71b..c0efaeab4d 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
@@ -76,6 +76,7 @@
<string name="activity_location_map_change">Simple Location Activity</string>
<string name="activity_location_modes">Location Modes Activity</string>
<string name="activity_location_fragment">Location Fragment</string>
+ <string name="activity_location_shift">Location Shift</string>
<string name="activity_location_manual">Manual Location updates</string>
<string name="activity_location_activation_builder">Build Location Activation</string>
<string name="activity_recyclerview_textureview">RecyclerView TextureView</string>