Skip to content

Commit

Permalink
fix location engine provider public APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
Guardiola31337 committed Sep 29, 2017
1 parent 1602ec8 commit 23b50d9
Show file tree
Hide file tree
Showing 11 changed files with 124 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,9 @@ private void updateValuesFromBundle(Bundle savedInstanceState) {
*/
private void buildAndroidLocationEngine() {
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
locationEngine = locationEngineProvider.obtainAvailableLocationEngines()
.get(LocationEngineProvider.GOOGLE_PLAY_SERVICES);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.GOOGLE_PLAY_SERVICES);
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainAvailableLocationEngines()
.get(LocationEngineProvider.ANDROID);
locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
}
locationEngine.addLocationEngineListener(this);
locationEngine.activate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,9 @@ public void onMapReady(MapboxMap mapboxMapReady) {

// Set up location services to improve accuracy
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
locationEngine = locationEngineProvider.obtainAvailableLocationEngines().get(LocationEngineProvider.LOST);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.LOST);
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainAvailableLocationEngines()
.get(LocationEngineProvider.ANDROID);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.ANDROID);
}
locationEngine.addLocationEngineListener(this);
locationEngine.activate();
Expand Down Expand Up @@ -102,7 +101,6 @@ private void updateMap(double latitude, double longitude) {
mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 5000, null);
}


@Override
protected void onStart() {
super.onStart();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
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;
Expand All @@ -29,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 @@ -56,36 +63,21 @@ 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);
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(this);
Map<String, LocationEngine> locationEngineDictionary = locationEngineProvider.obtainAvailableLocationEngines();
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[0])) {
locationEngine = locationEngineDictionary.get(engineName);
locationEngine = locationEngineProvider.obtainLocationEngineBy(locationEngineDictionary.get(engineName));
if (locationEngine == null) {
locationEngine = locationEngineProvider.obtainAvailableLocationEngines()
.get(LocationEngineProvider.ANDROID);
locationEngine = locationEngineProvider.obtainLocationEngineBy(LocationEngine.Type.ANDROID);
}
}

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>
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,11 @@ public void removeLocationUpdates() {
}
}

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

/*
* Logic methods for getting the user positions.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import com.mapbox.services.android.telemetry.http.TelemetryClient;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.navigation.MapboxNavigationEvent;
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;
import com.mapbox.services.android.telemetry.utils.TelemetryUtils;
Expand Down Expand Up @@ -478,7 +478,7 @@ public void run() {
private void registerLocationUpdates() {
if (locationEngine == null) {
LocationEngineProvider locationEngineProvider = new LocationEngineProvider(context);
locationEngine = locationEngineProvider.obtainAvailableLocationEngines().get(0);
locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable();
}

locationEngine.addLocationEngineListener(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ public void removeLocationUpdates() {
}
}

@Override
public Type obtainEventType() {
return Type.ANDROID;
}

/**
* Called when the location has changed.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,11 @@ public void removeLocationUpdates() {
}
}

@Override
public Type obtainEventType() {
return Type.GOOGLE_PLAY_SERVICES;
}

@Override
public void onLocationChanged(Location location) {
for (LocationEngineListener listener : locationListeners) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
* @since 2.0.0
*/
public abstract class LocationEngine {
public enum Type {
GOOGLE_PLAY_SERVICES, LOST, ANDROID, MOCK
}

private static final int TWO_MINUTES = 1000 * 60 * 2;

Expand Down Expand Up @@ -92,6 +95,8 @@ public LocationEngine() {
*/
public abstract void removeLocationUpdates();

public abstract Type obtainEventType();

/**
* Get the current priority being used.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,43 @@


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

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

public class LocationEngineProvider {

public static final String GOOGLE_PLAY_SERVICES = "Google Play Services";
public static final String LOST = "Lost";
public static final String ANDROID = "Android";
private Map<String, LocationEngine> locationEngineDictionary;
private Map<LocationEngine.Type, LocationEngine> locationEngineDictionary;
private static final List<LocationEngine.Type> OPTIONAL_LOCATION_ENGINES = new ArrayList<LocationEngine.Type>() {
{
add(LocationEngine.Type.GOOGLE_PLAY_SERVICES);
add(LocationEngine.Type.LOST);
}
};

public LocationEngineProvider(Context context) {
initAvailableLocationEngines(context);
}

public Map<String, LocationEngine> obtainAvailableLocationEngines() {
return locationEngineDictionary;
@NonNull
public LocationEngine obtainBestLocationEngineAvailable() {
return obtainBestLocationEngine();
}

@Nullable
public LocationEngine obtainLocationEngineBy(LocationEngine.Type type) {
LocationEngine locationEngine = locationEngineDictionary.get(type);
return locationEngine;
}

private void initAvailableLocationEngines(Context context) {
locationEngineDictionary = new HashMap<>();
Map<String, LocationEngineSupplier> locationEnginesDictionary = obtainDefaultLocationEnginesDictionary();
for (Map.Entry<String, LocationEngineSupplier> entry : locationEnginesDictionary.entrySet()) {
Map<LocationEngine.Type, LocationEngineSupplier> locationEnginesDictionary =
obtainDefaultLocationEnginesDictionary();
for (Map.Entry<LocationEngine.Type, LocationEngineSupplier> entry : locationEnginesDictionary.entrySet()) {
LocationEngineSupplier locationEngineSupplier = entry.getValue();
if (locationEngineSupplier.hasDependencyOnClasspath()) {
LocationEngine available = locationEngineSupplier.supply(context);
Expand All @@ -33,13 +47,24 @@ private void initAvailableLocationEngines(Context context) {
}
}

private Map<String, LocationEngineSupplier> obtainDefaultLocationEnginesDictionary() {
private Map<LocationEngine.Type, LocationEngineSupplier> obtainDefaultLocationEnginesDictionary() {
ClasspathChecker classpathChecker = new ClasspathChecker();
Map<String, LocationEngineSupplier> locationSources = new HashMap<>();
locationSources.put(GOOGLE_PLAY_SERVICES, new GoogleLocationEngineFactory(classpathChecker));
locationSources.put(LOST, new LostLocationEngineFactory(classpathChecker));
locationSources.put(ANDROID, new AndroidLocationEngineFactory());
Map<LocationEngine.Type, LocationEngineSupplier> locationSources = new HashMap<>();
locationSources.put(LocationEngine.Type.GOOGLE_PLAY_SERVICES, new GoogleLocationEngineFactory(classpathChecker));
locationSources.put(LocationEngine.Type.LOST, new LostLocationEngineFactory(classpathChecker));
locationSources.put(LocationEngine.Type.ANDROID, new AndroidLocationEngineFactory());

return locationSources;
}

private LocationEngine obtainBestLocationEngine() {
LocationEngine bestLocationEngine = locationEngineDictionary.get(LocationEngine.Type.ANDROID);
for (LocationEngine.Type type : OPTIONAL_LOCATION_ENGINES) {
bestLocationEngine = locationEngineDictionary.get(type);
if (bestLocationEngine != null) {
return bestLocationEngine;
}
}
return bestLocationEngine;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ public void removeLocationUpdates() {
}
}

@Override
public Type obtainEventType() {
return Type.LOST;
}

/**
* Invoked when the Location has changed.
*
Expand Down

0 comments on commit 23b50d9

Please sign in to comment.