Skip to content

Commit

Permalink
Make location provider optional (#502)
Browse files Browse the repository at this point in the history
* [WIP] make location provider optional

* [WIP] fix location engine provider providing only those that are available

* fix location engine provider public api and remove classes not necessary anymore

* fix location engine provider public APIs

* bump dependencies (build tools, support libraries, mapbox and lost) and address PR comments

* ignore location engine coming from mapbox-android-sdk momentarily so that CI passes (chicken-egg problem)

* fix naming

* fix some breaking API changes

* fix obtain best location engine not returning default location engine in some cases
  • Loading branch information
Guardiola31337 authored Oct 5, 2017
1 parent 0038b42 commit 2137263
Show file tree
Hide file tree
Showing 20 changed files with 354 additions and 108 deletions.
3 changes: 3 additions & 0 deletions mapbox/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ dependencies {
// Google Play Services
compile rootProject.ext.dep.gmsLocation

// LOST
compile rootProject.ext.dep.lost

// Picasso (Static Image)
compile rootProject.ext.dep.picasso

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import android.widget.Toast;

import com.mapbox.services.android.geocoder.AndroidGeocoder;
import com.mapbox.services.android.telemetry.location.AndroidLocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.location.LocationEngineProvider;
import com.mapbox.services.android.testapp.R;
import com.mapbox.services.android.testapp.geocoding.service.Constants;
import com.mapbox.services.android.testapp.geocoding.service.FetchAddressIntentService;
Expand Down Expand Up @@ -122,10 +122,14 @@ private void updateValuesFromBundle(Bundle savedInstanceState) {
}

/**
* Builds Android location engine
* Builds location engine
*/
private synchronized void buildAndroidLocationEngine() {
locationEngine = AndroidLocationEngine.getLocationEngine(this);
private void buildAndroidLocationEngine() {
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.GOOGLE_PLAY_SERVICES);
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
}
locationEngine.addLocationEngineListener(this);
locationEngine.activate();
}
Expand Down Expand Up @@ -264,8 +268,8 @@ private static class AddressResultReceiver extends ResultReceiver {
private final WeakReference<ProgressBar> progressBarReference;
private final WeakReference<Button> fetchAddressButtonReference;

public AddressResultReceiver(Handler handler, Context context, TextView resultTextView, ProgressBar progressBar,
Button fetchAddressButton) {
AddressResultReceiver(Handler handler, Context context, TextView resultTextView, ProgressBar progressBar,
Button fetchAddressButton) {
super(handler);
this.contextReference = new WeakReference<>(context);
this.textViewReference = new WeakReference<>(resultTextView);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.services.android.location.LostLocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.location.LocationEngineProvider;
import com.mapbox.services.android.testapp.R;
import com.mapbox.services.android.testapp.Utils;
import com.mapbox.services.android.ui.geocoder.GeocoderAutoCompleteView;
Expand Down Expand Up @@ -63,7 +63,11 @@ public void onMapReady(MapboxMap mapboxMapReady) {
});

// Set up location services to improve accuracy
locationEngine = LostLocationEngine.getLocationEngine(this);
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.LOST);
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.ANDROID);
}
locationEngine.addLocationEngineListener(this);
locationEngine.activate();
}
Expand All @@ -77,7 +81,7 @@ public void onConnected() {
@Override
public void onLocationChanged(Location location) {
if (location != null) {
Log.d(LOG_TAG, "New LOST location: " + location.toString());
Log.d(LOG_TAG, "New location: " + location.toString());
autocomplete.setProximity(Position.fromCoordinates(
location.getLongitude(), location.getLatitude()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,19 @@
import android.widget.Spinner;
import android.widget.TextView;

import com.mapbox.services.android.location.LostLocationEngine;
import com.mapbox.services.android.location.MockLocationEngine;
import com.mapbox.services.android.telemetry.location.AndroidLocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.location.LocationEnginePriority;
import com.mapbox.services.android.telemetry.location.LocationEngineProvider;
import com.mapbox.services.android.testapp.R;
import com.mapbox.services.commons.models.Position;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import timber.log.Timber;

public class LocationEngineActivity extends AppCompatActivity
Expand All @@ -28,13 +32,17 @@ public class LocationEngineActivity extends AppCompatActivity

private TextView textLocation;
private LocationEngine locationEngine;
private String[] locationEngines;
private LocationEngineProvider locationEngineProvider;
private Map<String, LocationEngine.Type> locationEngineDictionary;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location_engine);
textLocation = (TextView) findViewById(R.id.text_location);
setupSpinner();
setupLocationEngines();
}

@Override
Expand All @@ -55,38 +63,22 @@ protected void onPause() {
}
}

private void setupSpinner() {
Spinner spinner = (Spinner) findViewById(R.id.spinner_engine);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.location_engines, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(this);
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
String engineName = (String) parent.getItemAtPosition(pos);
Log.d(LOG_TAG, "Engine selected: " + engineName);
setNoEngine();

String[] locationEngines = getResources().getStringArray(R.array.location_engines);
if (engineName.equals(locationEngines[1])) {
// Mock
locationEngine = new MockLocationEngine();
((MockLocationEngine) locationEngine).setLastLocation(Position.fromLngLat(-87.62877, 41.87827));
((MockLocationEngine) locationEngine).moveToLocation(Position.fromLngLat(-87.6633, 41.8850));
} else if (engineName.equals(locationEngines[2])) {
// Android
locationEngine = AndroidLocationEngine.getLocationEngine(this);
} else if (engineName.equals(locationEngines[3])) {
// Lost
locationEngine = LostLocationEngine.getLocationEngine(this);
} else if (engineName.equals(locationEngines[4])) {
// Google Play Services
locationEngine = GoogleLocationEngine.getLocationEngine(this);
} else if (!engineName.equals(locationEngines[0])) {
locationEngine = locationEngineProvider.obtainLocationEngineBy(locationEngineDictionary.get(engineName));
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.ANDROID);
}
}

if (!engineName.equals(locationEngines[0]) && locationEngine != null) {
Expand All @@ -104,17 +96,6 @@ public void onNothingSelected(AdapterView<?> adapterView) {
setNoEngine();
}

private void setNoEngine() {
if (locationEngine != null) {
locationEngine.removeLocationUpdates();
locationEngine.removeLocationEngineListener(this);
locationEngine.deactivate();
}

textLocation.setText("No location updates, yet.");
locationEngine = null;
}

@Override
public void onConnected() {
Log.d(LOG_TAG, "Connected to engine, we can now request updates.");
Expand All @@ -128,4 +109,48 @@ public void onLocationChanged(Location location) {
textLocation.setText(location.toString());
}
}

private void setupSpinner() {
Spinner spinner = (Spinner) findViewById(R.id.spinner_engine);

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.location_engines, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(this);
}

private void setupLocationEngines() {
locationEngines = getResources().getStringArray(R.array.location_engines);
locationEngineProvider = new LocationEngineProvider(this);
locationEngineDictionary = obtainLocationEngineDictionary(locationEngines);
}

private Map<String, LocationEngine.Type> obtainLocationEngineDictionary(String[] locationEngines) {
List<LocationEngine.Type> values = Arrays.asList(LocationEngine.Type.values());
int mockLocationEngineAlreadyIncluded = 1;
int size = values.size() - mockLocationEngineAlreadyIncluded;
Map<String, LocationEngine.Type> dictionary = new HashMap<>(size);
for (int i = 2; i < locationEngines.length; i++) {
for (LocationEngine.Type type : values) {
if (locationEngines[i].equalsIgnoreCase(type.name())) {
dictionary.put(locationEngines[i], type);
break;
}
}
}
return dictionary;
}

private void setNoEngine() {
if (locationEngine != null) {
locationEngine.removeLocationUpdates();
locationEngine.removeLocationEngineListener(this);
locationEngine.deactivate();
}

textLocation.setText("No location updates, yet.");
locationEngine = null;
}
}
2 changes: 1 addition & 1 deletion mapbox/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
<item>Mock</item>
<item>Android</item>
<item>Lost</item>
<item>Google Play Services</item>
<item>Google_Play_Services</item>
</string-array>

</resources>
16 changes: 8 additions & 8 deletions mapbox/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ ext {
minSdkVersion = 15
targetSdkVersion = 25
compileSdkVersion = 25
buildToolsVersion = "25.0.2"
buildToolsVersion = "25.0.3"

dep = [
// Support
supportAppcompat : 'com.android.support:appcompat-v7:25.1.0',
supportCompat : 'com.android.support:support-compat:25.1.0',
supportDesign : 'com.android.support:design:25.1.0',
supportRecyclerview : 'com.android.support:recyclerview-v7:25.1.0',
supportCardView : 'com.android.support:cardview-v7:25.1.0',
supportAppcompat : 'com.android.support:appcompat-v7:25.3.1',
supportCompat : 'com.android.support:support-compat:25.3.1',
supportDesign : 'com.android.support:design:25.3.1',
supportRecyclerview : 'com.android.support:recyclerview-v7:25.3.1',
supportCardView : 'com.android.support:cardview-v7:25.3.1',

// mapbox
mapbox : 'com.mapbox.mapboxsdk:mapbox-android-sdk:5.1.0-SNAPSHOT@aar',
mapbox : 'com.mapbox.mapboxsdk:mapbox-android-sdk:5.1.4@aar',

// gson
gson : 'com.google.code.gson:gson:2.8.0',
Expand All @@ -36,7 +36,7 @@ ext {
okhttp3Mockwebserver : 'com.squareup.okhttp3:mockwebserver:3.6.0',

// lost
lost : 'com.mapzen.android:lost:1.1.1',
lost : 'com.mapzen.android:lost:3.0.3',

// play services
gmsLocation : 'com.google.android.gms:play-services-location:10.2.0',
Expand Down
5 changes: 0 additions & 5 deletions mapbox/libandroid-services/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,6 @@ dependencies {
// Timber for logging
compile rootProject.ext.dep.timber

// LOST
compile(rootProject.ext.dep.lost) {
exclude group: 'com.google.guava'
}

// Testing
testCompile rootProject.ext.dep.mockito
testCompile rootProject.ext.dep.okhttp3Mockwebserver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,11 @@ public void removeLocationUpdates() {
}
}

@Override
public Type obtainType() {
return Type.MOCK;
}

/*
* Logic methods for getting the user positions.
*/
Expand Down
8 changes: 8 additions & 0 deletions mapbox/libandroid-telemetry/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,19 @@ dependencies {
// OkHttp for network requests
compile rootProject.ext.dep.okhttp3

// Google Play Services
provided rootProject.ext.dep.gmsLocation

// LOST
provided rootProject.ext.dep.lost

// Testing
testCompile rootProject.ext.dep.junit
androidTestCompile(rootProject.ext.dep.supportEspresso, {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile rootProject.ext.dep.junit
testCompile rootProject.ext.dep.mockito
}

apply from: 'gradle-javadoc.gradle'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
import com.mapbox.services.android.telemetry.connectivity.ConnectivityReceiver;
import com.mapbox.services.android.telemetry.constants.TelemetryConstants;
import com.mapbox.services.android.telemetry.http.TelemetryClient;
import com.mapbox.services.android.telemetry.location.AndroidLocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.location.LocationEngineProvider;
import com.mapbox.services.android.telemetry.navigation.MapboxNavigationEvent;
import com.mapbox.services.android.telemetry.permissions.PermissionsManager;
import com.mapbox.services.android.telemetry.service.TelemetryService;
Expand Down Expand Up @@ -128,11 +128,11 @@ public void initialize(@NonNull Context context, @NonNull String accessToken, @N
/**
* Initialize MapboxTelemetry - with sdkIdentifier + sdkVersion
*
* @param context The context associated with the application
* @param accessToken The accessToken associated with the application
* @param userAgent source of requests
* @param sdkIdentifier Identifies which sdk is sending the event
* @param sdkVersion version of the sdk sending the event
* @param context The context associated with the application
* @param accessToken The accessToken associated with the application
* @param userAgent source of requests
* @param sdkIdentifier Identifies which sdk is sending the event
* @param sdkVersion version of the sdk sending the event
*/

public void initialize(@NonNull Context context, @NonNull String accessToken, @NonNull String userAgent,
Expand Down Expand Up @@ -476,9 +476,11 @@ public void run() {
}

private void registerLocationUpdates() {
if (locationEngine == null) {
locationEngine = new AndroidLocationEngine(context);
}
// TODO This has to be uncommented when https://github.com/mapbox/mapbox-gl-native/pull/9488 lands
// if (locationEngine == null) {
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(context);
locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
// }

locationEngine.addLocationEngineListener(this);
locationEngine.activate();
Expand Down
Loading

0 comments on commit 2137263

Please sign in to comment.