1+ package com.mapbox.mapboxandroiddemo.examples
2+
3+ import android.annotation.SuppressLint
4+ import android.os.Bundle
5+ import android.widget.Toast
6+ import androidx.annotation.NonNull
7+ import androidx.appcompat.app.AppCompatActivity
8+ import com.mapbox.android.core.location.*
9+ import com.mapbox.android.core.permissions.PermissionsListener
10+ import com.mapbox.android.core.permissions.PermissionsManager
11+ import com.mapbox.mapboxandroiddemo.R
12+ import com.mapbox.mapboxsdk.camera.CameraPosition
13+ import com.mapbox.mapboxsdk.geometry.LatLng
14+ import com.mapbox.mapboxsdk.location.LocationComponent
15+ import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions
16+ import com.mapbox.mapboxsdk.location.modes.CameraMode
17+ import com.mapbox.mapboxsdk.location.modes.RenderMode
18+ import com.mapbox.mapboxsdk.maps.MapboxMap
19+ import com.mapbox.mapboxsdk.maps.MapboxMapOptions
20+ import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
21+ import com.mapbox.mapboxsdk.maps.Style
22+ import com.mapbox.mapboxsdk.plugins.china.constants.ChinaStyle
23+ import com.mapbox.mapboxsdk.plugins.china.maps.ChinaMapView
24+ import com.mapbox.mapboxsdk.plugins.china.shift.ChinaBoundsChecker
25+
26+ class ChinaBoundsCheckerActivity : AppCompatActivity (), OnMapReadyCallback,
27+ LocationEngineCallback <LocationEngineResult >, PermissionsListener {
28+
29+ private lateinit var mapboxMap: MapboxMap
30+ private var savedInstanceState: Bundle ? = null
31+ private var deviceInChina: Boolean? = null
32+ private var chinaMapView: ChinaMapView ? = null
33+ private var locationComponent: LocationComponent ? = null
34+ private var permissionsManager: PermissionsManager ? = null
35+ private var locationEngine: LocationEngine ? = null
36+ private val defaultIntervalInMilliseconds = 1000L
37+ private val defaultMaxWaitTime = defaultIntervalInMilliseconds * 5
38+
39+ // Adjust the Styles below to see various China and non-China styles used in this example
40+ private val chinaStyleToUse: String = ChinaStyle .MAPBOX_DARK_CHINESE
41+
42+ override fun onCreate (savedInstanceState : Bundle ? ) {
43+ super .onCreate(savedInstanceState)
44+
45+ // Mapbox access token is configured here. This needs to be called either in your application
46+ // object or in the same activity which contains the mapview.
47+ this .savedInstanceState = savedInstanceState
48+ locationPermissionCheckAndStart()
49+ }
50+
51+ override fun onMapReady (mapboxMap : MapboxMap ) {
52+ this .mapboxMap = mapboxMap
53+ mapboxMap.setStyle(Style .Builder ().fromUri(
54+
55+ // TODO: Because of privacy reasons, this file isn't actually included
56+ // in the app. Add the file to an assets folder.
57+ // Please email Mapbox at apac-bd@mapbox.com if you're
58+ // interested in this file and/or have questions about
59+ // this general functionality.
60+ if (deviceInChina!! ) chinaStyleToUse else
61+ " asset://cn_style_with_english_labels.json" )) {
62+
63+ Toast .makeText(this @ChinaBoundsCheckerActivity,
64+ String .format(getString(R .string.device_location),
65+ if (deviceInChina!! ) " is" else " isn't" ), Toast .LENGTH_SHORT ).show()
66+
67+ initLocationComponent(it)
68+ }
69+ }
70+
71+ override fun onSuccess (result : LocationEngineResult ? ) {
72+ val lastLocation = result?.lastLocation
73+ if (deviceInChina == null ) {
74+ deviceInChina = ChinaBoundsChecker .locationIsInChina(
75+ this @ChinaBoundsCheckerActivity, result?.lastLocation)
76+ initMap(
77+ MapboxMapOptions .createFromAttributes(this , null )
78+ .camera(
79+ CameraPosition .Builder ()
80+ .target(LatLng (lastLocation?.latitude!! ,
81+ lastLocation.longitude))
82+ .zoom(10.0 )
83+ .build()),
84+ savedInstanceState)
85+ }
86+ locationComponent?.forceLocationUpdate(lastLocation)
87+ }
88+
89+ override fun onFailure (exception : Exception ) {
90+ Toast .makeText(this , String .format(" get location failed: %s" ,
91+ exception.localizedMessage), Toast .LENGTH_SHORT ).show()
92+ }
93+
94+ private fun locationPermissionCheckAndStart () {
95+ // Check if permissions are enabled and if not request
96+ if (PermissionsManager .areLocationPermissionsGranted(this )) {
97+ initLocationEngine()
98+ } else {
99+ permissionsManager = PermissionsManager (this ).apply {
100+ requestLocationPermissions(this @ChinaBoundsCheckerActivity)
101+ }
102+ }
103+ }
104+
105+ private fun initMap (
106+ mapboxMapOptions : MapboxMapOptions ,
107+ savedInstanceState : Bundle ?
108+ ) {
109+ chinaMapView = ChinaMapView (this , mapboxMapOptions).apply {
110+ onCreate(savedInstanceState)
111+ getMapAsync(this @ChinaBoundsCheckerActivity)
112+ setContentView(this )
113+ }
114+ }
115+
116+ @SuppressWarnings(" MissingPermission" )
117+ fun initLocationComponent (@NonNull fullyLoadedStyle : Style ) {
118+ locationComponent = mapboxMap.locationComponent
119+ locationComponent?.apply {
120+ // Activate the LocationComponent with LocationComponentActivationOptions
121+ activateLocationComponent(LocationComponentActivationOptions .builder(
122+ this @ChinaBoundsCheckerActivity,
123+ fullyLoadedStyle).build())
124+
125+ // Enable to make the LocationComponent visible
126+ isLocationComponentEnabled = true
127+
128+ // Set the LocationComponent's camera mode
129+ cameraMode = CameraMode .NONE
130+
131+ // Set the LocationComponent's render mode
132+ renderMode = RenderMode .NORMAL
133+ }
134+ }
135+
136+ @SuppressLint(" MissingPermission" )
137+ private fun initLocationEngine () {
138+ locationEngine = LocationEngineProvider .getBestLocationEngine(this ).apply {
139+ requestLocationUpdates(LocationEngineRequest .Builder (defaultIntervalInMilliseconds)
140+ .setPriority(LocationEngineRequest .PRIORITY_HIGH_ACCURACY )
141+ .setMaxWaitTime(defaultMaxWaitTime).build(),
142+ this @ChinaBoundsCheckerActivity, mainLooper)
143+ getLastLocation(this @ChinaBoundsCheckerActivity)
144+ }
145+ }
146+
147+ override fun onRequestPermissionsResult (requestCode : Int , permissions : Array <String >, grantResults : IntArray ) {
148+ super .onRequestPermissionsResult(requestCode, permissions, grantResults)
149+ permissionsManager?.onRequestPermissionsResult(requestCode, permissions, grantResults)
150+ }
151+
152+ override fun onExplanationNeeded (permissionsToExplain : List <String >) {
153+ Toast .makeText(this , R .string.user_location_permission_explanation, Toast .LENGTH_LONG ).show()
154+ }
155+
156+ override fun onPermissionResult (granted : Boolean ) {
157+ if (granted) {
158+ locationPermissionCheckAndStart()
159+ } else {
160+ Toast .makeText(this , R .string.user_location_permission_not_granted, Toast .LENGTH_LONG ).show()
161+ finish()
162+ }
163+ }
164+
165+ override fun onResume () {
166+ super .onResume()
167+ chinaMapView?.onResume()
168+ }
169+
170+ override fun onStart () {
171+ super .onStart()
172+ chinaMapView?.onStart()
173+ }
174+
175+ override fun onStop () {
176+ super .onStop()
177+ chinaMapView?.onStop()
178+ }
179+
180+ public override fun onPause () {
181+ super .onPause()
182+ chinaMapView?.onPause()
183+ }
184+
185+ override fun onLowMemory () {
186+ super .onLowMemory()
187+ chinaMapView?.onLowMemory()
188+ }
189+
190+ override fun onDestroy () {
191+ super .onDestroy()
192+ chinaMapView?.onDestroy()
193+ }
194+
195+ override fun onSaveInstanceState (outState : Bundle ) {
196+ super .onSaveInstanceState(outState)
197+ chinaMapView?.onSaveInstanceState(outState)
198+ }
199+ }
0 commit comments