[android] refactor LocationComponent to utilize LocationEngineRequest

This commit is contained in:
Łukasz Paczos
2018-11-12 17:11:51 +01:00
committed by Łukasz Paczos
parent 2c70f4b6dc
commit 216b0d8a93
10 changed files with 420 additions and 223 deletions

View File

@@ -105,8 +105,7 @@ class LocationFragmentActivity : AppCompatActivity() {
mapView.getMapAsync {
mapboxMap = it
component = mapboxMap.locationComponent
component?.activateLocationComponent(activity,
LocationEngineProvider.getBestLocationEngine(activity, false))
component?.activateLocationComponent(activity)
component?.isLocationComponentEnabled = true
component?.locationEngine?.getLastLocation(this)
}

View File

@@ -4,45 +4,36 @@ import android.annotation.SuppressLint;
import android.content.res.Configuration;
import android.location.Location;
import android.os.Bundle;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ListPopupWindow;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Toast;
import com.mapbox.android.core.location.LocationEngine;
import com.mapbox.android.core.location.LocationEngineCallback;
import com.mapbox.android.core.location.LocationEngineProvider;
import com.mapbox.android.core.location.LocationEngineRequest;
import com.mapbox.android.core.location.LocationEngineResult;
import com.mapbox.android.core.permissions.PermissionsListener;
import com.mapbox.android.core.permissions.PermissionsManager;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.constants.Style;
import com.mapbox.mapboxsdk.location.LocationComponent;
import com.mapbox.mapboxsdk.location.LocationComponentOptions;
import com.mapbox.mapboxsdk.location.OnCameraTrackingChangedListener;
import com.mapbox.mapboxsdk.location.OnLocationClickListener;
import com.mapbox.mapboxsdk.location.modes.CameraMode;
import com.mapbox.mapboxsdk.location.modes.RenderMode;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.location.LocationComponentOptions;
import com.mapbox.mapboxsdk.location.LocationComponent;
import com.mapbox.mapboxsdk.location.OnCameraTrackingChangedListener;
import com.mapbox.mapboxsdk.location.modes.CameraMode;
import com.mapbox.mapboxsdk.location.modes.RenderMode;
import com.mapbox.mapboxsdk.testapp.R;
import java.util.ArrayList;
import java.util.List;
public class LocationModesActivity extends AppCompatActivity implements OnMapReadyCallback,
OnLocationClickListener, OnCameraTrackingChangedListener {
private static final long DEFAULT_INTERVAL_MILLIS = 1000;
private static final long DEFAULT_FASTEST_INTERVAL_MILLIS = 1000;
OnLocationClickListener, OnCameraTrackingChangedListener {
private MapView mapView;
private Button locationModeBtn;
@@ -51,7 +42,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
private PermissionsManager permissionsManager;
private LocationComponent locationComponent;
private LocationEngine locationEngine;
private MapboxMap mapboxMap;
private boolean customStyle;
@@ -67,8 +57,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
private Location lastLocation;
private LocationEngineCallback<LocationEngineResult> locationEngineCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -77,25 +65,19 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
mapView = findViewById(R.id.mapView);
locationModeBtn = findViewById(R.id.button_location_mode);
locationModeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (locationComponent == null) {
return;
}
showModeListDialog();
locationModeBtn.setOnClickListener(v -> {
if (locationComponent == null) {
return;
}
showModeListDialog();
});
locationTrackingBtn = findViewById(R.id.button_location_tracking);
locationTrackingBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (locationComponent == null) {
return;
}
showTrackingListDialog();
locationTrackingBtn.setOnClickListener(v -> {
if (locationComponent == null) {
return;
}
showTrackingListDialog();
});
@@ -141,20 +123,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
public void onMapReady(@NonNull MapboxMap mapboxMap) {
this.mapboxMap = mapboxMap;
locationEngine = LocationEngineProvider.getBestLocationEngine(getApplicationContext(),
false);
locationEngineCallback = new LocationEngineCallback<LocationEngineResult>() {
@Override
public void onSuccess(LocationEngineResult result) {
// noop
}
@Override
public void onFailure(@NonNull Exception exception) {
// noop
}
};
int[] padding;
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
padding = new int[] {0, 750, 0, 0};
@@ -168,7 +136,13 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
.build();
locationComponent = mapboxMap.getLocationComponent();
locationComponent.activateLocationComponent(this, locationEngine, options);
locationComponent.activateLocationComponent(this, true,
new LocationEngineRequest.Builder(750)
.setFastestInterval(750)
.setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
.build()
);
locationComponent.applyStyle(options);
locationComponent.setLocationComponentEnabled(true);
locationComponent.addOnLocationClickListener(this);
locationComponent.addOnCameraTrackingChangedListener(this);
@@ -248,14 +222,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
protected void onStart() {
super.onStart();
mapView.onStart();
if (locationEngine != null) {
try {
locationEngine.requestLocationUpdates(getLocationRequst(DEFAULT_INTERVAL_MILLIS),
locationEngineCallback, Looper.getMainLooper());
} catch (SecurityException se) {
se.printStackTrace();
}
}
}
@Override
@@ -274,9 +240,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
protected void onStop() {
super.onStop();
mapView.onStop();
if (locationEngine != null) {
locationEngine.removeLocationUpdates(locationEngineCallback);
}
}
@SuppressLint("MissingPermission")
@@ -303,13 +266,6 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea
mapView.onLowMemory();
}
private static LocationEngineRequest getLocationRequst(long interval) {
return new LocationEngineRequest.Builder(interval)
.setFastestInterval(DEFAULT_FASTEST_INTERVAL_MILLIS)
.setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
.build();
}
@Override
public void onLocationComponentClick() {
Toast.makeText(this, "OnLocationComponentClick", Toast.LENGTH_LONG).show();

View File

@@ -1,38 +1,28 @@
package com.mapbox.mapboxsdk.testapp.activity.location;
import android.location.Location;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import com.mapbox.android.core.location.LocationEngine;
import com.mapbox.android.core.location.LocationEngineCallback;
import com.mapbox.android.core.location.LocationEngineProvider;
import com.mapbox.android.core.location.LocationEngineRequest;
import com.mapbox.android.core.location.LocationEngineResult;
import com.mapbox.android.core.permissions.PermissionsListener;
import com.mapbox.android.core.permissions.PermissionsManager;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.location.LocationComponent;
import com.mapbox.mapboxsdk.location.modes.RenderMode;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.location.LocationComponent;
import com.mapbox.mapboxsdk.location.modes.RenderMode;
import com.mapbox.mapboxsdk.testapp.R;
import java.util.List;
import timber.log.Timber;
public class ManualLocationUpdatesActivity extends AppCompatActivity implements OnMapReadyCallback,
LocationEngineCallback<LocationEngineResult> {
private static final long DEFAULT_INTERVAL_MILLIS = 1000;
private static final long DEFAULT_FASTEST_INTERVAL_MILLIS = 1000;
public class ManualLocationUpdatesActivity extends AppCompatActivity implements OnMapReadyCallback {
private MapView mapView;
private LocationComponent locationComponent;
@@ -44,43 +34,38 @@ public class ManualLocationUpdatesActivity extends AppCompatActivity implements
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location_manual_update);
locationEngine = LocationEngineProvider.getBestLocationEngine(this, false);
FloatingActionButton fabManualUpdate = findViewById(R.id.fabManualLocationChange);
fabManualUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (locationComponent != null && locationComponent.getLocationEngine() == null) {
locationComponent.forceLocationUpdate(
Utils.getRandomLocation(LatLngBounds.from(60, 25, 40, -5)));
}
fabManualUpdate.setOnClickListener(v -> {
if (locationComponent != null && locationComponent.getLocationEngine() == null) {
locationComponent.forceLocationUpdate(
Utils.getRandomLocation(LatLngBounds.from(60, 25, 40, -5)));
}
});
fabManualUpdate.setEnabled(false);
FloatingActionButton fabToggle = findViewById(R.id.fabToggleManualLocation);
fabToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (locationComponent != null) {
locationComponent.setLocationEngine(locationComponent.getLocationEngine() == null ? locationEngine :
null);
fabToggle.setOnClickListener(v -> {
if (locationComponent != null) {
locationComponent.setLocationEngine(locationComponent.getLocationEngine() == null ? locationEngine : null);
if (locationComponent.getLocationEngine() == null) {
fabToggle.setImageResource(R.drawable.ic_layers_clear);
fabManualUpdate.setEnabled(true);
fabManualUpdate.setAlpha(1f);
Toast.makeText(
ManualLocationUpdatesActivity.this.getApplicationContext(),
"LocationEngine disable, use manual updates",
Toast.LENGTH_SHORT).show();
} else {
fabToggle.setImageResource(R.drawable.ic_layers);
fabManualUpdate.setEnabled(false);
fabManualUpdate.setAlpha(0.5f);
Toast.makeText(
ManualLocationUpdatesActivity.this.getApplicationContext(),
"LocationEngine enabled",
Toast.LENGTH_SHORT).show();
}
if (locationComponent.getLocationEngine() == null) {
fabToggle.setImageResource(R.drawable.ic_layers_clear);
fabManualUpdate.setEnabled(true);
fabManualUpdate.setAlpha(1f);
Toast.makeText(
ManualLocationUpdatesActivity.this.getApplicationContext(),
"LocationEngine disabled, use manual updates",
Toast.LENGTH_SHORT).show();
} else {
fabToggle.setImageResource(R.drawable.ic_layers);
fabManualUpdate.setEnabled(false);
fabManualUpdate.setAlpha(0.5f);
Toast.makeText(
ManualLocationUpdatesActivity.this.getApplicationContext(),
"LocationEngine enabled",
Toast.LENGTH_SHORT).show();
}
}
});
@@ -119,35 +104,25 @@ public class ManualLocationUpdatesActivity extends AppCompatActivity implements
permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@SuppressLint("MissingPermission")
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
locationEngine = LocationEngineProvider.getBestLocationEngine(getApplicationContext(),
false);
locationComponent = mapboxMap.getLocationComponent();
locationComponent.activateLocationComponent(this, locationEngine);
locationComponent.activateLocationComponent(
this,
locationEngine,
new LocationEngineRequest.Builder(500)
.setFastestInterval(500)
.setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
.build());
locationComponent.setLocationComponentEnabled(true);
locationComponent.setRenderMode(RenderMode.COMPASS);
}
private static LocationEngineRequest getLocationRequst(long interval) {
return new LocationEngineRequest.Builder(interval)
.setFastestInterval(DEFAULT_FASTEST_INTERVAL_MILLIS)
.setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
.build();
}
@Override
protected void onStart() {
super.onStart();
mapView.onStart();
if (locationEngine != null) {
try {
locationEngine.requestLocationUpdates(getLocationRequst(DEFAULT_INTERVAL_MILLIS),
this, Looper.getMainLooper());
} catch (SecurityException se) {
se.printStackTrace();
}
}
}
@Override
@@ -166,9 +141,6 @@ public class ManualLocationUpdatesActivity extends AppCompatActivity implements
protected void onStop() {
super.onStop();
mapView.onStop();
if (locationEngine != null) {
locationEngine.removeLocationUpdates(this);
}
}
@Override
@@ -188,17 +160,4 @@ public class ManualLocationUpdatesActivity extends AppCompatActivity implements
super.onLowMemory();
mapView.onLowMemory();
}
@Override
public void onSuccess(LocationEngineResult result) {
Location location = result.getLastLocation();
if (location != null) {
Timber.d("Location change occurred: %s", location.toString());
}
}
@Override
public void onFailure(@NonNull Exception exception) {
Timber.d("Location engine error occurred: %s", exception.getMessage());
}
}