Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Add shift for location of camera. #14984

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.mapbox.geojson.shifter.CoordinateShifterManager;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.utils.MathUtils;

import java.util.List;

/**
* Resembles the position, angle, zoom and tilt of the user's viewpoint.
*/
Expand Down Expand Up @@ -82,6 +86,24 @@ public CameraPosition[] newArray(int size) {
this.zoom = zoom;
}

/**
* Do shift for target location and get the shifted target.
*
* @return the shifted target.
*/
public LatLng getShiftedTarget() {
if (target != null) {
//todo: add check after https://github.com/mapbox/mapbox-java/issues/1057 is resolved.
List<Double> shifted = CoordinateShifterManager.getCoordinateShifter()
.shiftLonLat(target.getLongitude(), target.getLatitude());
if (shifted != null && shifted.size() > 1) {
return new LatLng(shifted.get(1),shifted.get(0));
}
}
return new LatLng();

}

/**
* Describe the kinds of special objects contained in this Parcelable's
* marshalled representation.
Expand Down Expand Up @@ -168,7 +190,6 @@ public int hashCode() {
* Builder for composing CameraPosition objects.
*/
public static final class Builder {

private double bearing = -1;
@Nullable
private LatLng target = null;
Expand Down Expand Up @@ -312,7 +333,7 @@ public Builder zoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM,
* @return CameraPosition
*/
public CameraPosition build() {
return new CameraPosition(target, zoom, tilt, bearing);
return new CameraPosition(this.target, zoom, tilt, bearing);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ public final void moveCamera(@NonNull MapboxMap mapboxMap, CameraUpdate update,
if (isValidCameraPosition(cameraPosition)) {
cancelTransitions();
cameraChangeDispatcher.onCameraMoveStarted(OnCameraMoveStartedListener.REASON_API_ANIMATION);
nativeMap.jumpTo(cameraPosition.target, cameraPosition.zoom, cameraPosition.tilt, cameraPosition.bearing);
nativeMap.jumpTo(cameraPosition.getShiftedTarget(), cameraPosition.zoom, cameraPosition.tilt,
cameraPosition.bearing);
cameraChangeDispatcher.onCameraIdle();
invalidateCameraPosition();
handler.post(new Runnable() {
Expand All @@ -134,8 +135,8 @@ final void easeCamera(@NonNull MapboxMap mapboxMap, CameraUpdate update, int dur
cameraCancelableCallback = callback;
}
mapView.addOnCameraDidChangeListener(this);
nativeMap.easeTo(cameraPosition.target, cameraPosition.zoom, cameraPosition.bearing, cameraPosition.tilt,
durationMs, easingInterpolator);
nativeMap.easeTo(cameraPosition.getShiftedTarget(), cameraPosition.zoom, cameraPosition.bearing,
cameraPosition.tilt, durationMs, easingInterpolator);
}
}

Expand All @@ -154,7 +155,7 @@ public final void animateCamera(@NonNull MapboxMap mapboxMap, CameraUpdate updat
cameraCancelableCallback = callback;
}
mapView.addOnCameraDidChangeListener(this);
nativeMap.flyTo(cameraPosition.target, cameraPosition.zoom, cameraPosition.bearing,
nativeMap.flyTo(cameraPosition.getShiftedTarget(), cameraPosition.zoom, cameraPosition.bearing,
cameraPosition.tilt, durationMs);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,17 @@
android:name="android.support.PARENT_ACTIVITY"
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"
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
1 change: 1 addition & 0 deletions platform/android/scripts/exclude-activity-gen.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"RenderTestActivity",
"SymbolLayerActivity",
"LocationFragmentActivity",
"LocationShiftActivity",
"MergeOfflineRegionsActivity",
"NestedViewPagerActivity",
"DebugModeActivity",
Expand Down