Skip to content
This repository was archived by the owner on Oct 7, 2024. It is now read-only.

Commit b28742e

Browse files
author
Langston Smith
authored
Adding china bounds checker example (#1252)
1 parent 270e8bc commit b28742e

7 files changed

Lines changed: 222 additions & 0 deletions

File tree

MapboxAndroidDemo/src/china/java/com/mapbox/mapboxandroiddemo/MainActivity.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.mapbox.mapboxandroiddemo.adapter.ExampleAdapter;
3030
import com.mapbox.mapboxandroiddemo.commons.AnalyticsTracker;
3131
import com.mapbox.mapboxandroiddemo.commons.FirstTimeRunChecker;
32+
import com.mapbox.mapboxandroiddemo.examples.ChinaBoundsCheckerActivity;
3233
import com.mapbox.mapboxandroiddemo.examples.SimpleChinaMapViewActivity;
3334
import com.mapbox.mapboxandroiddemo.examples.labs.AnimatedMarkerActivity;
3435
import com.mapbox.mapboxandroiddemo.examples.basics.KotlinSimpleMapViewActivity;
@@ -389,6 +390,14 @@ private void initializeModels() {
389390
null,
390391
R.string.activity_china_simple_china_mapview_url, false, BuildConfig.MIN_SDK_VERSION));
391392

393+
exampleItemModels.add(new ExampleItemModel(
394+
R.id.nav_basics,
395+
R.string.activity_china_simple_china_bounds_checker_title,
396+
R.string.activity_china_simple_china_bounds_checker_description,
397+
new Intent(MainActivity.this, ChinaBoundsCheckerActivity.class),
398+
null,
399+
R.string.activity_china_simple_china_bounds_checker_url, false, BuildConfig.MIN_SDK_VERSION));
400+
392401
exampleItemModels.add(new ExampleItemModel(
393402
R.id.nav_styles,
394403
R.string.activity_styles_basic_symbol_layer_title,
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
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+
}

MapboxAndroidDemo/src/main/AndroidManifest.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,14 @@
996996
android:name="android.support.PARENT_ACTIVITY"
997997
android:value="com.mapbox.mapboxandroiddemo.MainActivity" />
998998
</activity>
999+
<activity
1000+
android:name=".examples.ChinaBoundsCheckerActivity"
1001+
android:label="@string/activity_china_simple_china_bounds_checker_title"
1002+
android:screenOrientation="portrait">
1003+
<meta-data
1004+
android:name="android.support.PARENT_ACTIVITY"
1005+
android:value="com.mapbox.mapboxandroiddemo.MainActivity" />
1006+
</activity>
9991007

10001008
<service android:name=".account.AccountRetrievalService" />
10011009
<receiver android:name=".utils.DemoAppHomeScreenAddressWidget">

MapboxAndroidDemo/src/main/res/values/activity_strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,4 +424,7 @@
424424
<!-- Variable label placement-->
425425
<string name="zoom_map_in_and_out_circle_to_icon_transition">Zoom in and out to see the circles transition to icons</string>
426426

427+
<!-- China bounds checker-->
428+
<string name="device_location">Device %1$s in China</string>
429+
427430
</resources>

MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,5 +136,6 @@
136136
<string name="activity_lab_change_attribution_color_description">Adjust the attribution "i" to match a map style, app UI, or color motif.</string>
137137
<string name="activity_lab_shared_preferences_description">Use the Android system\'s Shared Preferences to save and retrieve coordinates.</string>
138138
<string name="activity_china_simple_china_mapview_description">Show an accurate and government-approved China map in your app using the Mapbox Maps SDK.</string>
139+
<string name="activity_china_simple_china_bounds_checker_description">Use the China plugin to determine whether or not the device is inside of China.</string>
139140

140141
</resources>

MapboxAndroidDemo/src/main/res/values/titles_strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
<string name="activity_dds_polygon_select_toggle_title">Polygon toggle</string>
132132
<string name="activity_lab_drag_draw_title">Drawing search area</string>
133133
<string name="activity_china_simple_china_mapview_title">China map view</string>
134+
<string name="activity_china_simple_china_bounds_checker_title">Device in China</string>
134135
<string name="activity_lab_home_screen_widget_title">Homescreen geocoding widget</string>
135136
<string name="activity_lab_rv_directions_title">RecyclerView Directions</string>
136137
<string name="activity_lab_spinning_icon_title">Spinning icon</string>

MapboxAndroidDemo/src/main/res/values/urls_strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,5 @@
134134
<string name="activity_lab_change_attribution_color_url" translatable="false">https://i.imgur.com/cGv98jb.png</string>
135135
<string name="activity_lab_shared_preferences_url" translatable="false">https://i.imgur.com/znxAhDG.png</string>
136136
<string name="activity_china_simple_china_mapview_url" translatable="false">https://i.imgur.com/KwoEynZ.png</string>
137+
<string name="activity_china_simple_china_bounds_checker_url" translatable="false">https://i.imgur.com/fIFWqJu.png</string>
137138
</resources>

0 commit comments

Comments
 (0)