Skip to content

Commit 89d0ca4

Browse files
authored
[WIP] Abstract the location engine from a specific provider (#269)
* remove v4 activity, again * replace PermissionsUtils with a more core PermissionsManager * implement changes in testapp * update to latest lost version * abstract location engine that any provider can implement * sample location engines implementations * update permissions logic * sample location engine activity * let's not keep references to any activity or context * typo * only one is necessary to have location updates * add synchronized keyworkd * fix javadoc * small javadoc fix * minor rename * update CHANGELOG.md
1 parent 5d0c1b9 commit 89d0ca4

21 files changed

Lines changed: 844 additions & 339 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
Mapbox welcomes participation and contributions from everyone.
44

5+
### v2.0.0
6+
7+
* `libjava` and `libandroid` now live under the same (Android Studio) project. These projects are now split up into: `libjava-core`, `libjava-geojson`, `libjava-services`, `libjava-services-rx`, `libandroid-telemetry`, `libandroid-services`, `libandroid-ui`, independently published to Maven to reduce method count on Android apps.
8+
* New `LocationEngine` that can be implemented by different location providers (open source or proprietary), decoupled from other components so that it can be used for telemetry, user tracking (map), navigation, or mocking use-cases. Sample implementations for Lost (`LostLocationEngine`), Google Play Services (`GoogleLocationEngine`) and Mock provider (`MockLocationEngine`).
9+
* New `PermissionsManager` and `PermissionsListener` that replaces the old `PermissionsUtils` to be more flexible checking for any kind of permission, not just location, at runtime.
10+
511
### v1.3.2
612

713
* Geocoding: added poi.landmark type

mapbox/app/build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,10 @@ dependencies {
5252
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
5353

5454
// LOST
55-
compile ('com.mapzen.android:lost:1.1.1') {
56-
exclude group: 'com.google.guava'
57-
}
55+
compile 'com.mapzen.android:lost:2.1.2'
56+
57+
// Google Play Services
58+
compile 'com.google.android.gms:play-services-location:10.0.1'
5859

5960
// Picasso (Static Image)
6061
compile 'com.squareup.picasso:picasso:2.5.2'

mapbox/app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
<category android:name="android.intent.category.LAUNCHER"/>
2828
</intent-filter>
2929
</activity>
30+
<activity
31+
android:name=".location.LocationEngineActivity"
32+
android:label="@string/title_location">
33+
<meta-data
34+
android:name="android.support.PARENT_ACTIVITY"
35+
android:value=".MainActivity"/>
36+
</activity>
3037
<activity
3138
android:name=".directions.DirectionsV5Activity"
3239
android:label="@string/title_directions_v5">

mapbox/app/src/main/java/com/mapbox/services/android/testapp/MainActivity.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import android.view.View;
1212
import android.view.ViewGroup;
1313
import android.widget.TextView;
14+
import android.widget.Toast;
1415

1516
import com.mapbox.services.android.BuildConfig;
17+
import com.mapbox.services.android.telemetry.permissions.PermissionsListener;
18+
import com.mapbox.services.android.telemetry.permissions.PermissionsManager;
1619
import com.mapbox.services.android.testapp.directions.DirectionsV5Activity;
1720
import com.mapbox.services.android.testapp.directions.RouteUtilsV5Activity;
1821
import com.mapbox.services.android.testapp.distance.DistanceActivity;
@@ -21,6 +24,7 @@
2124
import com.mapbox.services.android.testapp.geocoding.GeocodingWidgetActivity;
2225
import com.mapbox.services.android.testapp.icons.DirectionsIconsActivity;
2326
import com.mapbox.services.android.testapp.icons.MakiIconsActivity;
27+
import com.mapbox.services.android.testapp.location.LocationEngineActivity;
2428
import com.mapbox.services.android.testapp.nav.OffRouteDetectionActivity;
2529
import com.mapbox.services.android.testapp.staticimage.StaticImageActivity;
2630
import com.mapbox.services.android.testapp.turf.TurfBearingActivity;
@@ -31,28 +35,32 @@
3135
import com.mapbox.services.android.testapp.turf.TurfMidpointActivity;
3236
import com.mapbox.services.android.testapp.utils.MapMatchingActivity;
3337
import com.mapbox.services.android.testapp.utils.SimplifyPolylineActivity;
34-
import com.mapbox.services.android.utils.PermissionsUtils;
3538

3639
import java.util.ArrayList;
3740
import java.util.Arrays;
3841
import java.util.List;
3942

4043
/**
41-
* This activity shows how to use PermissionsUtils to request location permissions
44+
* This activity shows how to use PermissionsManager to request location permissions
4245
* from the user. It loads all the sample activities using a RecyclerView.
4346
*/
44-
public class MainActivity extends AppCompatActivity {
47+
public class MainActivity extends AppCompatActivity implements PermissionsListener {
4548

4649
private static final String LOG_TAG = "MainActivity";
4750

4851
private RecyclerView recyclerView;
52+
private PermissionsManager permissionsManager;
4953

5054
@Override
5155
protected void onCreate(Bundle savedInstanceState) {
5256
super.onCreate(savedInstanceState);
5357
setContentView(R.layout.activity_main);
5458

5559
final List<SampleItem> samples = new ArrayList<>(Arrays.asList(
60+
new SampleItem(
61+
getString(R.string.title_location),
62+
getString(R.string.description_location),
63+
LocationEngineActivity.class),
5664
new SampleItem(
5765
getString(R.string.title_distance),
5866
getString(R.string.description_distance),
@@ -162,18 +170,31 @@ protected void onCreate(Bundle savedInstanceState) {
162170
recyclerView.setAdapter(adapter);
163171

164172
// Check for location permission
165-
if (!PermissionsUtils.isLocationGranted(this)) {
173+
permissionsManager = new PermissionsManager(this);
174+
if (!permissionsManager.areLocationPermissionsGranted(this)) {
166175
recyclerView.setEnabled(false);
167-
PermissionsUtils.startPermissionFlow(this);
176+
permissionsManager.requestLocationPermissions(this);
168177
}
169178
}
170179

171180
@Override
172181
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
173-
if (PermissionsUtils.isRequestSuccessful(requestCode, permissions, grantResults)) {
182+
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
183+
}
184+
185+
@Override
186+
public void onExplanationNeeded(List<String> permissionsToExplain) {
187+
Toast.makeText(this, "This app needs location permissions in order to show its functionality.",
188+
Toast.LENGTH_LONG).show();
189+
}
190+
191+
@Override
192+
public void onPermissionResult(boolean granted) {
193+
if (granted) {
174194
recyclerView.setEnabled(true);
175195
} else {
176-
PermissionsUtils.explainFallback(this);
196+
Toast.makeText(this, "You didn't grant location permissions.",
197+
Toast.LENGTH_LONG).show();
177198
}
178199
}
179200

mapbox/app/src/main/java/com/mapbox/services/android/testapp/directions/DirectionsV4Activity.java

Lines changed: 0 additions & 184 deletions
This file was deleted.

mapbox/app/src/main/java/com/mapbox/services/android/testapp/geocoding/GeocodingServiceActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ protected void onStart() {
151151
private void getLastLocation() {
152152
// Gets the best and most recent location currently available, which may be null
153153
// in rare cases when a location is not available.
154-
lastLocation = LocationServices.FusedLocationApi.getLastLocation();
154+
//noinspection MissingPermission
155+
lastLocation = LocationServices.FusedLocationApi.getLastLocation(lostApiClient);
155156
if (lastLocation != null) {
156157
// Determine whether a Geocoder is available.
157158
if (!AndroidGeocoder.isPresent()) {

mapbox/app/src/main/java/com/mapbox/services/android/testapp/geocoding/GeocodingWidgetActivity.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.mapzen.android.lost.api.LocationListener;
2323
import com.mapzen.android.lost.api.LocationRequest;
2424
import com.mapzen.android.lost.api.LocationServices;
25+
import com.mapzen.android.lost.api.LostApiClient;
2526

2627
public class GeocodingWidgetActivity extends AppCompatActivity {
2728

@@ -65,13 +66,27 @@ public void onMapReady(MapboxMap mapboxMapReady) {
6566
LocationRequest request = LocationRequest.create()
6667
.setInterval(5000)
6768
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
68-
LocationServices.FusedLocationApi.requestLocationUpdates(request, new LocationListener() {
69+
LostApiClient lostApiClient = new LostApiClient.Builder(this).build();
70+
71+
//noinspection MissingPermission
72+
LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, new LocationListener() {
73+
6974
@Override
7075
public void onLocationChanged(Location location) {
7176
Log.d(LOG_TAG, "New LOST location: " + location.toString());
7277
autocomplete.setProximity(Position.fromCoordinates(
7378
location.getLongitude(), location.getLatitude()));
7479
}
80+
81+
@Override
82+
public void onProviderDisabled(String provider) {
83+
Log.d(LOG_TAG, "onProviderDisabled: " + provider);
84+
}
85+
86+
@Override
87+
public void onProviderEnabled(String provider) {
88+
Log.d(LOG_TAG, "onProviderEnabled: " + provider);
89+
}
7590
});
7691
}
7792

0 commit comments

Comments
 (0)