diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/plugins/locationlayer/LocationLayerPlugin.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/plugins/locationlayer/LocationLayerPlugin.java
index 45a13ed58..021729b6b 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/plugins/locationlayer/LocationLayerPlugin.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/plugins/locationlayer/LocationLayerPlugin.java
@@ -143,7 +143,7 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
*
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
+ * Note : This method will initialize and use an internal {@link LocationEngine}.
*
* @param context the context
*/
@@ -155,10 +155,10 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
- *
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
*
- * @param context the context
+ * @param context the context
+ * @param useDefaultLocationEngine true if you want to initialize and use the built-in location engine or false if
+ * there should be no location engine initialized
*/
@RequiresPermission(anyOf = {ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION})
public void activateLocationLayerPlugin(@NonNull Context context, boolean useDefaultLocationEngine) {
@@ -172,7 +172,7 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
*
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
+ * Note : This method will initialize and use an internal {@link LocationEngine}.
*
* @param context the context
* @param styleRes the LocationLayerPlugin style res
@@ -185,7 +185,7 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
*
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
+ * Note : This method will initialize and use an internal {@link LocationEngine}.
*
*
* @param context the context
@@ -200,9 +200,6 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
- *
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
- *
*
* @param context the context
* @param locationEngine the engine, or null if you'd like to only force location updates
@@ -215,9 +212,16 @@ public final class LocationLayerPlugin {
/**
* This method will show the location icon and enable the camera tracking the location.
- *
- * Note : This constructor will initialize and use an internal {@link LocationEngine}.
- *
+ *
+ * @param context the context
+ * @param locationEngine the engine
+ */
+ public void activateLocationLayerPlugin(@NonNull Context context, @NonNull LocationEngine locationEngine) {
+ activateLocationLayerPlugin(context, locationEngine, R.style.mapbox_LocationLayer);
+ }
+
+ /**
+ * This method will show the location icon and enable the camera tracking the location.
*
* @param locationEngine the engine, or null if you'd like to only force location updates
* @param options the options
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/build.gradle b/platform/android/MapboxGLAndroidSDKTestApp/build.gradle
index cf0a8ed66..dee713ffc 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/build.gradle
+++ b/platform/android/MapboxGLAndroidSDKTestApp/build.gradle
@@ -11,6 +11,9 @@ android {
versionCode 13
versionName "6.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ vectorDrawables {
+ useSupportLibrary true
+ }
}
compileOptions {
@@ -63,6 +66,7 @@ dependencies {
implementation dependenciesList.supportAppcompatV7
implementation dependenciesList.supportRecyclerView
implementation dependenciesList.supportDesign
+ implementation dependenciesList.supportConstraintLayout
// implementation dependenciesList.lost
implementation dependenciesList.gmsLocation
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
index d9e200147..8597a9ac1 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml
@@ -815,6 +815,50 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
?) {
+ Toast.makeText(this@LocationLayerFragmentActivity, "You need to accept location permissions.",
+ Toast.LENGTH_SHORT).show()
+ }
+
+ override fun onPermissionResult(granted: Boolean) {
+ if (granted) {
+ if (savedInstanceState == null) {
+ fragmentManager
+ .beginTransaction()
+ .replace(R.id.container, LocationLayerFragment.newInstance(), LocationLayerFragment.TAG)
+ .commit()
+ }
+ } else {
+ finish()
+ }
+ }
+ })
+ permissionsManager.requestLocationPermissions(this)
+ }
+ }
+
+ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ }
+
+ class LocationLayerFragment : Fragment(), LocationEngineListener {
+ companion object {
+ const val TAG = "LLFragment"
+ fun newInstance(): LocationLayerFragment {
+ return LocationLayerFragment()
+ }
+ }
+
+ private lateinit var mapView: MapView
+ private lateinit var mapboxMap: MapboxMap
+ private var plugin: LocationLayerPlugin? = null
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ mapView = MapView(inflater.context)
+ return mapView
+ }
+
+ @SuppressLint("MissingPermission")
+ override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync {
+ mapboxMap = it
+ plugin = mapboxMap.locationLayerPlugin
+ plugin?.activateLocationLayerPlugin(activity)
+ plugin?.locationEngine?.addLocationEngineListener(this)
+ }
+ }
+
+ override fun onLocationChanged(location: Location?) {
+ if (location != null) {
+ mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location), 12.0))
+ plugin?.locationEngine?.removeLocationEngineListener(this)
+ }
+ }
+
+ override fun onConnected() {
+ // no impl
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ mapView.onDestroy()
+ plugin?.locationEngine?.removeLocationEngineListener(this)
+ }
+ }
+
+ class EmptyFragment : Fragment() {
+ companion object {
+ const val TAG = "EmptyFragment"
+ fun newInstance(): EmptyFragment {
+ return EmptyFragment()
+ }
+ }
+
+ override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
+ val textView = TextView(inflater?.context)
+ textView.text = "This is an empty Fragment"
+ return textView
+ }
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerMapChangeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerMapChangeActivity.java
new file mode 100644
index 000000000..e59627d35
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerMapChangeActivity.java
@@ -0,0 +1,131 @@
+package com.mapbox.mapboxsdk.testapp.activity.location;
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+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.permissions.PermissionsListener;
+import com.mapbox.android.core.permissions.PermissionsManager;
+import com.mapbox.mapboxsdk.maps.MapView;
+import com.mapbox.mapboxsdk.maps.MapboxMap;
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
+import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
+import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
+import com.mapbox.mapboxsdk.testapp.R;
+
+import java.util.List;
+
+public class LocationLayerMapChangeActivity extends AppCompatActivity implements OnMapReadyCallback {
+
+ private MapView mapView;
+ private MapboxMap mapboxMap;
+ private PermissionsManager permissionsManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_location_layer_map_change);
+
+ mapView = findViewById(R.id.mapView);
+ FloatingActionButton stylesFab = findViewById(R.id.fabStyles);
+
+ stylesFab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mapboxMap != null) {
+ mapboxMap.setStyleUrl(Utils.getNextStyle());
+ }
+ }
+ });
+
+ mapView.setStyleUrl(Utils.getNextStyle());
+ mapView.onCreate(savedInstanceState);
+
+ if (PermissionsManager.areLocationPermissionsGranted(this)) {
+ mapView.getMapAsync(this);
+ } else {
+ permissionsManager = new PermissionsManager(new PermissionsListener() {
+ @Override
+ public void onExplanationNeeded(List permissionsToExplain) {
+ Toast.makeText(LocationLayerMapChangeActivity.this, "You need to accept location permissions.",
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onPermissionResult(boolean granted) {
+ if (granted) {
+ mapView.getMapAsync(LocationLayerMapChangeActivity.this);
+ } else {
+ finish();
+ }
+ }
+ });
+ permissionsManager.requestLocationPermissions(this);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+
+ @Override
+ public void onMapReady(MapboxMap mapboxMap) {
+ this.mapboxMap = mapboxMap;
+ activateLocationLayer();
+ }
+
+ @SuppressLint("MissingPermission")
+ private void activateLocationLayer() {
+ LocationLayerPlugin locationPlugin = mapboxMap.getLocationLayerPlugin();
+ locationPlugin.activateLocationLayerPlugin(this);
+ locationPlugin.setRenderMode(RenderMode.COMPASS);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mapView.onStart();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mapView.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mapView.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mapView.onStop();
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mapView.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mapView.onDestroy();
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ mapView.onLowMemory();
+ }
+}
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerModesActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerModesActivity.java
new file mode 100644
index 000000000..ce005c182
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationLayerModesActivity.java
@@ -0,0 +1,393 @@
+package com.mapbox.mapboxsdk.testapp.activity.location;
+
+import android.annotation.SuppressLint;
+import android.content.res.Configuration;
+import android.location.Location;
+import android.os.Bundle;
+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.LocationEngineListener;
+import com.mapbox.android.core.location.LocationEnginePriority;
+import com.mapbox.android.core.location.LocationEngineProvider;
+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.maps.MapView;
+import com.mapbox.mapboxsdk.maps.MapboxMap;
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
+import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerOptions;
+import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
+import com.mapbox.mapboxsdk.plugins.locationlayer.OnCameraTrackingChangedListener;
+import com.mapbox.mapboxsdk.plugins.locationlayer.OnLocationLayerClickListener;
+import com.mapbox.mapboxsdk.plugins.locationlayer.modes.CameraMode;
+import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
+import com.mapbox.mapboxsdk.testapp.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LocationLayerModesActivity extends AppCompatActivity implements OnMapReadyCallback,
+ LocationEngineListener, OnLocationLayerClickListener, OnCameraTrackingChangedListener {
+
+ private MapView mapView;
+ private Button locationModeBtn;
+ private Button locationTrackingBtn;
+
+ private PermissionsManager permissionsManager;
+
+ private LocationLayerPlugin locationLayerPlugin;
+ private LocationEngine locationEngine;
+ private MapboxMap mapboxMap;
+ private boolean customStyle;
+
+ private static final String SAVED_STATE_CAMERA = "saved_state_camera";
+ private static final String SAVED_STATE_RENDER = "saved_state_render";
+
+ @CameraMode.Mode
+ private int cameraMode = CameraMode.TRACKING;
+
+ @RenderMode.Mode
+ private int renderMode = RenderMode.NORMAL;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_location_layer_mode);
+
+ mapView = findViewById(R.id.mapView);
+
+ locationModeBtn = findViewById(R.id.button_location_mode);
+ locationModeBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (locationLayerPlugin == null) {
+ return;
+ }
+ showModeListDialog();
+ }
+ });
+
+ locationTrackingBtn = findViewById(R.id.button_location_tracking);
+ locationTrackingBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (locationLayerPlugin == null) {
+ return;
+ }
+ showTrackingListDialog();
+ }
+ });
+
+
+ if (savedInstanceState != null) {
+ cameraMode = savedInstanceState.getInt(SAVED_STATE_CAMERA);
+ renderMode = savedInstanceState.getInt(SAVED_STATE_RENDER);
+ }
+
+ mapView.onCreate(savedInstanceState);
+
+ if (PermissionsManager.areLocationPermissionsGranted(this)) {
+ mapView.getMapAsync(this);
+ } else {
+ permissionsManager = new PermissionsManager(new PermissionsListener() {
+ @Override
+ public void onExplanationNeeded(List permissionsToExplain) {
+ Toast.makeText(LocationLayerModesActivity.this, "You need to accept location permissions.",
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onPermissionResult(boolean granted) {
+ if (granted) {
+ mapView.getMapAsync(LocationLayerModesActivity.this);
+ } else {
+ finish();
+ }
+ }
+ });
+ permissionsManager.requestLocationPermissions(this);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+
+ @SuppressLint("MissingPermission")
+ @Override
+ public void onMapReady(MapboxMap mapboxMap) {
+ this.mapboxMap = mapboxMap;
+
+ locationEngine = new LocationEngineProvider(this).obtainBestLocationEngineAvailable();
+ locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
+ locationEngine.setFastestInterval(1000);
+ locationEngine.addLocationEngineListener(this);
+ locationEngine.activate();
+
+ locationLayerPlugin = mapboxMap.getLocationLayerPlugin();
+ locationLayerPlugin.addOnLocationClickListener(this);
+ locationLayerPlugin.addOnCameraTrackingChangedListener(this);
+ locationLayerPlugin.setCameraMode(cameraMode);
+ setRendererMode(renderMode);
+ activateLocationLayer();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_location_mode, menu);
+ return true;
+ }
+
+ @SuppressLint("MissingPermission")
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (locationLayerPlugin == null) {
+ return super.onOptionsItemSelected(item);
+ }
+
+ int id = item.getItemId();
+ if (id == R.id.action_style_change) {
+ toggleStyle();
+ return true;
+ } else if (id == R.id.action_map_style_change) {
+ toggleMapStyle();
+ return true;
+ } else if (id == R.id.action_plugin_disable) {
+ locationLayerPlugin.deactivateLocationLayerPlugin();
+ return true;
+ } else if (id == R.id.action_plugin_enabled) {
+ activateLocationLayer();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void activateLocationLayer() {
+ if (locationLayerPlugin != null) {
+ int[] padding;
+ if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+ padding = new int[] {0, 750, 0, 0};
+ } else {
+ padding = new int[] {0, 250, 0, 0};
+ }
+
+ LocationLayerOptions options = LocationLayerOptions.builder(this)
+ .padding(padding)
+ .layerBelow("waterway-label")
+ .build();
+
+ locationLayerPlugin.activateLocationLayerPlugin(locationEngine, options);
+ }
+ }
+
+ public void toggleStyle() {
+ customStyle = !customStyle;
+ locationLayerPlugin.applyStyle(
+ this,
+ customStyle ? R.style.CustomLocationLayer : R.style.mapbox_LocationLayer);
+ }
+
+ public void toggleMapStyle() {
+ String styleUrl = mapboxMap.getStyleUrl().contentEquals(Style.DARK) ? Style.LIGHT : Style.DARK;
+ mapboxMap.setStyle(styleUrl);
+ }
+
+ public LocationLayerPlugin getLocationLayerPlugin() {
+ return locationLayerPlugin;
+ }
+
+ @Override
+ @SuppressWarnings( {"MissingPermission"})
+ protected void onStart() {
+ super.onStart();
+ mapView.onStart();
+ if (locationEngine != null) {
+ locationEngine.addLocationEngineListener(this);
+ if (locationEngine.isConnected()) {
+ locationEngine.requestLocationUpdates();
+ } else {
+ locationEngine.activate();
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mapView.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mapView.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mapView.onStop();
+ if (locationEngine != null) {
+ locationEngine.removeLocationEngineListener(this);
+ locationEngine.removeLocationUpdates();
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mapView.onSaveInstanceState(outState);
+ outState.putInt(SAVED_STATE_CAMERA, cameraMode);
+ outState.putInt(SAVED_STATE_RENDER, renderMode);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mapView.onDestroy();
+ if (locationEngine != null) {
+ locationEngine.deactivate();
+ }
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ mapView.onLowMemory();
+ }
+
+ @Override
+ @SuppressWarnings( {"MissingPermission"})
+ public void onConnected() {
+ locationEngine.requestLocationUpdates();
+ }
+
+ @Override
+ public void onLocationChanged(Location location) {
+ // no impl
+ }
+
+ @Override
+ public void onLocationLayerClick() {
+ Toast.makeText(this, "OnLocationLayerClick", Toast.LENGTH_LONG).show();
+ }
+
+ private void showModeListDialog() {
+ List modes = new ArrayList<>();
+ modes.add("Normal");
+ modes.add("Compass");
+ modes.add("GPS");
+ ArrayAdapter profileAdapter = new ArrayAdapter<>(this,
+ android.R.layout.simple_list_item_1, modes);
+ ListPopupWindow listPopup = new ListPopupWindow(this);
+ listPopup.setAdapter(profileAdapter);
+ listPopup.setAnchorView(locationModeBtn);
+ listPopup.setOnItemClickListener((parent, itemView, position, id) -> {
+ String selectedMode = modes.get(position);
+ locationModeBtn.setText(selectedMode);
+ if (selectedMode.contentEquals("Normal")) {
+ setRendererMode(RenderMode.NORMAL);
+ } else if (selectedMode.contentEquals("Compass")) {
+ setRendererMode(RenderMode.COMPASS);
+ } else if (selectedMode.contentEquals("GPS")) {
+ setRendererMode(RenderMode.GPS);
+ }
+ listPopup.dismiss();
+ });
+ listPopup.show();
+ }
+
+ private void setRendererMode(@RenderMode.Mode int mode) {
+ renderMode = mode;
+ locationLayerPlugin.setRenderMode(mode);
+ if (mode == RenderMode.NORMAL) {
+ locationModeBtn.setText("Normal");
+ } else if (mode == RenderMode.COMPASS) {
+ locationModeBtn.setText("Compass");
+ } else if (mode == RenderMode.GPS) {
+ locationModeBtn.setText("Gps");
+ }
+ }
+
+ private void showTrackingListDialog() {
+ List trackingTypes = new ArrayList<>();
+ trackingTypes.add("None");
+ trackingTypes.add("Tracking");
+ trackingTypes.add("Tracking Compass");
+ trackingTypes.add("Tracking GPS");
+ trackingTypes.add("Tracking GPS North");
+ ArrayAdapter profileAdapter = new ArrayAdapter<>(this,
+ android.R.layout.simple_list_item_1, trackingTypes);
+ ListPopupWindow listPopup = new ListPopupWindow(this);
+ listPopup.setAdapter(profileAdapter);
+ listPopup.setAnchorView(locationTrackingBtn);
+ listPopup.setOnItemClickListener((parent, itemView, position, id) -> {
+ String selectedTrackingType = trackingTypes.get(position);
+ locationTrackingBtn.setText(selectedTrackingType);
+ if (selectedTrackingType.contentEquals("None")) {
+ locationLayerPlugin.setCameraMode(CameraMode.NONE);
+ } else if (selectedTrackingType.contentEquals("Tracking")) {
+ locationLayerPlugin.setCameraMode(CameraMode.TRACKING);
+ } else if (selectedTrackingType.contentEquals("Tracking Compass")) {
+ locationLayerPlugin.setCameraMode(CameraMode.TRACKING_COMPASS);
+ } else if (selectedTrackingType.contentEquals("Tracking GPS")) {
+ locationLayerPlugin.setCameraMode(CameraMode.TRACKING_GPS);
+ } else if (selectedTrackingType.contentEquals("Tracking GPS North")) {
+ locationLayerPlugin.setCameraMode(CameraMode.TRACKING_GPS_NORTH);
+ }
+ listPopup.dismiss();
+
+ if (locationLayerPlugin.getCameraMode() != CameraMode.NONE) {
+ locationLayerPlugin.zoomWhileTracking(15, 750, new MapboxMap.CancelableCallback() {
+ @Override
+ public void onCancel() {
+ // No impl
+ }
+
+ @Override
+ public void onFinish() {
+ locationLayerPlugin.tiltWhileTracking(45);
+ }
+ });
+ } else {
+ mapboxMap.easeCamera(CameraUpdateFactory.tiltTo(0));
+ }
+ });
+ listPopup.show();
+ }
+
+ @Override
+ public void onCameraTrackingDismissed() {
+ locationTrackingBtn.setText("None");
+ }
+
+ @Override
+ public void onCameraTrackingChanged(int currentMode) {
+ this.cameraMode = currentMode;
+
+ if (cameraMode == CameraMode.NONE) {
+ locationTrackingBtn.setText("None");
+ } else if (cameraMode == CameraMode.TRACKING) {
+ locationTrackingBtn.setText("Tracking");
+ } else if (cameraMode == CameraMode.TRACKING_COMPASS) {
+ locationTrackingBtn.setText("Tracking Compass");
+ } else if (cameraMode == CameraMode.TRACKING_GPS) {
+ locationTrackingBtn.setText("Tracking GPS");
+ } else if (cameraMode == CameraMode.TRACKING_GPS_NORTH) {
+ locationTrackingBtn.setText("Tracking GPS North");
+ }
+ }
+}
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/ManualLocationUpdatesActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/ManualLocationUpdatesActivity.java
new file mode 100644
index 000000000..3e9f0853e
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/ManualLocationUpdatesActivity.java
@@ -0,0 +1,190 @@
+package com.mapbox.mapboxsdk.testapp.activity.location;
+
+import android.location.Location;
+import android.os.Bundle;
+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.LocationEngineListener;
+import com.mapbox.android.core.location.LocationEnginePriority;
+import com.mapbox.android.core.location.LocationEngineProvider;
+import com.mapbox.android.core.permissions.PermissionsListener;
+import com.mapbox.android.core.permissions.PermissionsManager;
+import com.mapbox.mapboxsdk.geometry.LatLngBounds;
+import com.mapbox.mapboxsdk.maps.MapView;
+import com.mapbox.mapboxsdk.maps.MapboxMap;
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
+import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin;
+import com.mapbox.mapboxsdk.plugins.locationlayer.modes.RenderMode;
+import com.mapbox.mapboxsdk.testapp.R;
+
+import java.util.List;
+
+import timber.log.Timber;
+
+public class ManualLocationUpdatesActivity extends AppCompatActivity implements OnMapReadyCallback,
+ LocationEngineListener {
+
+ private MapView mapView;
+ private LocationLayerPlugin locationLayerPlugin;
+ private LocationEngine locationEngine;
+ private PermissionsManager permissionsManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_location_manual_update);
+
+ FloatingActionButton fabManualUpdate = findViewById(R.id.fabManualLocationChange);
+ fabManualUpdate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (locationLayerPlugin != null && locationLayerPlugin.getLocationEngine() == null) {
+ locationLayerPlugin.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 (locationLayerPlugin != null) {
+ locationLayerPlugin.setLocationEngine(locationLayerPlugin.getLocationEngine() == null ? locationEngine :
+ null);
+
+ if (locationLayerPlugin.getLocationEngine() == null) {
+ fabToggle.setImageResource(R.drawable.ic_layers_clear);
+ fabManualUpdate.setEnabled(true);
+ fabManualUpdate.setAlpha(1f);
+ Toast.makeText(
+ ManualLocationUpdatesActivity.this,
+ "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,
+ "LocationEngine enabled",
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+
+ mapView = findViewById(R.id.mapView);
+ mapView.onCreate(savedInstanceState);
+
+ if (PermissionsManager.areLocationPermissionsGranted(this)) {
+ mapView.getMapAsync(this);
+ } else {
+ permissionsManager = new PermissionsManager(new PermissionsListener() {
+ @Override
+ public void onExplanationNeeded(List permissionsToExplain) {
+ Toast.makeText(ManualLocationUpdatesActivity.this, "You need to accept location permissions.",
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onPermissionResult(boolean granted) {
+ if (granted) {
+ mapView.getMapAsync(ManualLocationUpdatesActivity.this);
+ } else {
+ finish();
+ }
+ }
+ });
+ permissionsManager.requestLocationPermissions(this);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+
+ @Override
+ public void onMapReady(MapboxMap mapboxMap) {
+ locationEngine = new LocationEngineProvider(this).obtainBestLocationEngineAvailable();
+ locationEngine.addLocationEngineListener(this);
+ locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
+ locationEngine.activate();
+ locationLayerPlugin = mapboxMap.getLocationLayerPlugin();
+ locationLayerPlugin.activateLocationLayerPlugin(this, locationEngine);
+ locationLayerPlugin.setRenderMode(RenderMode.COMPASS);
+ }
+
+ @Override
+ @SuppressWarnings( {"MissingPermission"})
+ public void onConnected() {
+ locationEngine.requestLocationUpdates();
+ }
+
+ @Override
+ public void onLocationChanged(Location location) {
+ Timber.d("Location change occurred: %s", location.toString());
+ }
+
+ @Override
+ @SuppressWarnings( {"MissingPermission"})
+ protected void onStart() {
+ super.onStart();
+ mapView.onStart();
+ if (locationEngine != null) {
+ locationEngine.requestLocationUpdates();
+ locationEngine.addLocationEngineListener(this);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mapView.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mapView.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mapView.onStop();
+ if (locationEngine != null) {
+ locationEngine.removeLocationEngineListener(this);
+ locationEngine.removeLocationUpdates();
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mapView.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mapView.onDestroy();
+ if (locationEngine != null) {
+ locationEngine.deactivate();
+ }
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ mapView.onLowMemory();
+ }
+}
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/Utils.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/Utils.java
new file mode 100644
index 000000000..41c308c69
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/Utils.java
@@ -0,0 +1,59 @@
+package com.mapbox.mapboxsdk.testapp.activity.location;
+
+import android.location.Location;
+
+import com.mapbox.mapboxsdk.constants.Style;
+import com.mapbox.mapboxsdk.geometry.LatLngBounds;
+
+import java.util.Random;
+
+import timber.log.Timber;
+
+/**
+ * Useful utilities used throughout the testapp.
+ */
+public class Utils {
+
+ private static final String[] STYLES = new String[] {
+ Style.MAPBOX_STREETS,
+ Style.OUTDOORS,
+ Style.LIGHT,
+ Style.DARK,
+ Style.SATELLITE_STREETS
+ };
+
+ private static int index;
+
+ /**
+ * Utility to cycle through map styles. Useful to test if runtime styling source and layers transfer over to new
+ * style.
+ *
+ * @return a string ID representing the map style
+ */
+ public static String getNextStyle() {
+ index++;
+ if (index == STYLES.length) {
+ index = 0;
+ }
+ return STYLES[index];
+ }
+
+ /**
+ * Utility for getting a random coordinate inside a provided bounds and creates a {@link Location} from it.
+ *
+ * @param bounds bounds of the generated location
+ * @return a {@link Location} object using the random coordinate
+ */
+ public static Location getRandomLocation(LatLngBounds bounds) {
+ Random random = new Random();
+
+ double randomLat = bounds.getLatSouth() + (bounds.getLatNorth() - bounds.getLatSouth()) * random.nextDouble();
+ double randomLon = bounds.getLonWest() + (bounds.getLonEast() - bounds.getLonWest()) * random.nextDouble();
+
+ Location location = new Location("random-loc");
+ location.setLongitude(randomLon);
+ location.setLatitude(randomLat);
+ Timber.d("getRandomLatLng: %s", location.toString());
+ return location;
+ }
+}
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_arrow.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_arrow.xml
new file mode 100644
index 000000000..65c3b4aae
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_arrow.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_icon.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_icon.xml
new file mode 100644
index 000000000..37f1d4de0
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_icon.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_puck_icon.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_puck_icon.xml
new file mode 100644
index 000000000..31d93f1ed
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/custom_user_puck_icon.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/ic_location_disabled.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/ic_location_disabled.xml
new file mode 100644
index 000000000..16f058f32
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable/ic_location_disabled.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_fragment.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_fragment.xml
new file mode 100644
index 000000000..3c1436a1a
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_fragment.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_map_change.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_map_change.xml
new file mode 100644
index 000000000..54171a073
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_map_change.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_mode.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_mode.xml
new file mode 100644
index 000000000..e23d876e3
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_layer_mode.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_manual_update.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_manual_update.xml
new file mode 100644
index 000000000..3aac74a1e
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_location_manual_update.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml
new file mode 100644
index 000000000..7ce217ecd
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/categories.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/categories.xml
index aafeb1cd9..a4403a34f 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/categories.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/categories.xml
@@ -14,4 +14,5 @@
Features
Storage
Texture View
+ Location
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
index 6c68edc4d..05035760f 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml
@@ -71,4 +71,8 @@
Use HeatmapLayer to visualise earthquakes
Manipulate gestures detector\'s settings
Click to add a marker, long-click to drag
+ Change map\'s style while location is displayed
+ Showcases location render and tracking modes
+ Uses LocationLayer in a Fragment
+ Force location updates and don\'t rely on the engine
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/styles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/styles.xml
index 777d8a5f5..facc16929 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/styles.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/styles.xml
@@ -38,4 +38,16 @@
+
+
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
index ddf351886..f094a67b3 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml
@@ -71,4 +71,8 @@
Heatmap layer
Gestures detector
Draggable marker
+ Simple Location Activity
+ Location Modes Activity
+ Location Fragment
+ Manual Location updates
\ No newline at end of file
diff --git a/platform/android/gradle/dependencies.gradle b/platform/android/gradle/dependencies.gradle
index 86571bb05..af9b7e00b 100644
--- a/platform/android/gradle/dependencies.gradle
+++ b/platform/android/gradle/dependencies.gradle
@@ -8,62 +8,64 @@ ext {
]
versions = [
- mapboxServices : '3.4.1',
- mapboxTelemetry: '3.1.5',
- mapboxGestures : '0.2.0',
- supportLib : '27.1.1',
- espresso : '3.0.2',
- testRunner : '1.0.2',
- leakCanary : '1.6.1',
- junit : '4.12',
- mockito : '2.18.3',
- robolectric : '3.8',
- timber : '4.7.1',
- okhttp : '3.11.0',
- kotlin : '1.2.51',
- licenses : '0.8.41',
- lint : '26.1.3'
+ mapboxServices : '3.4.1',
+ mapboxTelemetry : '3.1.5',
+ mapboxGestures : '0.2.0',
+ supportLib : '27.1.1',
+ constraintLayout: '1.1.2',
+ espresso : '3.0.2',
+ testRunner : '1.0.2',
+ leakCanary : '1.6.1',
+ junit : '4.12',
+ mockito : '2.18.3',
+ robolectric : '3.8',
+ timber : '4.7.1',
+ okhttp : '3.11.0',
+ kotlin : '1.2.51',
+ licenses : '0.8.41',
+ lint : '26.1.3'
]
dependenciesList = [
- mapboxJavaServices : "com.mapbox.mapboxsdk:mapbox-sdk-services:${versions.mapboxServices}",
- mapboxJavaGeoJSON : "com.mapbox.mapboxsdk:mapbox-sdk-geojson:${versions.mapboxServices}",
- mapboxAndroidTelemetry: "com.mapbox.mapboxsdk:mapbox-android-telemetry:${versions.mapboxTelemetry}",
- mapboxAndroidGestures : "com.mapbox.mapboxsdk:mapbox-android-gestures:${versions.mapboxGestures}",
+ mapboxJavaServices : "com.mapbox.mapboxsdk:mapbox-sdk-services:${versions.mapboxServices}",
+ mapboxJavaGeoJSON : "com.mapbox.mapboxsdk:mapbox-sdk-geojson:${versions.mapboxServices}",
+ mapboxAndroidTelemetry : "com.mapbox.mapboxsdk:mapbox-android-telemetry:${versions.mapboxTelemetry}",
+ mapboxAndroidGestures : "com.mapbox.mapboxsdk:mapbox-android-gestures:${versions.mapboxGestures}",
// for testApp
- mapboxJavaTurf : "com.mapbox.mapboxsdk:mapbox-sdk-turf:${versions.mapboxServices}",
+ mapboxJavaTurf : "com.mapbox.mapboxsdk:mapbox-sdk-turf:${versions.mapboxServices}",
- junit : "junit:junit:${versions.junit}",
- mockito : "org.mockito:mockito-core:${versions.mockito}",
- robolectric : "org.robolectric:robolectric:${versions.robolectric}",
+ junit : "junit:junit:${versions.junit}",
+ mockito : "org.mockito:mockito-core:${versions.mockito}",
+ robolectric : "org.robolectric:robolectric:${versions.robolectric}",
- testRunner : "com.android.support.test:runner:${versions.testRunner}",
- testRules : "com.android.support.test:rules:${versions.testRunner}",
- testEspressoCore : "com.android.support.test.espresso:espresso-core:${versions.espresso}",
- testEspressoIntents : "com.android.support.test.espresso:espresso-intents:${versions.espresso}",
- testEspressoContrib : "com.android.support.test.espresso:espresso-contrib:${versions.espresso}",
+ testRunner : "com.android.support.test:runner:${versions.testRunner}",
+ testRules : "com.android.support.test:rules:${versions.testRunner}",
+ testEspressoCore : "com.android.support.test.espresso:espresso-core:${versions.espresso}",
+ testEspressoIntents : "com.android.support.test.espresso:espresso-intents:${versions.espresso}",
+ testEspressoContrib : "com.android.support.test.espresso:espresso-contrib:${versions.espresso}",
- supportAnnotations : "com.android.support:support-annotations:${versions.supportLib}",
- supportAppcompatV7 : "com.android.support:appcompat-v7:${versions.supportLib}",
- supportFragmentV4 : "com.android.support:support-fragment:${versions.supportLib}",
- supportUtilV4 : "com.android.support:support-core-utils:${versions.supportLib}",
- supportDesign : "com.android.support:design:${versions.supportLib}",
- supportRecyclerView : "com.android.support:recyclerview-v7:${versions.supportLib}",
+ supportAnnotations : "com.android.support:support-annotations:${versions.supportLib}",
+ supportAppcompatV7 : "com.android.support:appcompat-v7:${versions.supportLib}",
+ supportFragmentV4 : "com.android.support:support-fragment:${versions.supportLib}",
+ supportUtilV4 : "com.android.support:support-core-utils:${versions.supportLib}",
+ supportDesign : "com.android.support:design:${versions.supportLib}",
+ supportRecyclerView : "com.android.support:recyclerview-v7:${versions.supportLib}",
+ supportConstraintLayout: "com.android.support.constraint:constraint-layout:${versions.constraintLayout}",
- gmsLocation : 'com.google.android.gms:play-services-location:11.0.4',
- timber : "com.jakewharton.timber:timber:${versions.timber}",
- okhttp3 : "com.squareup.okhttp3:okhttp:${versions.okhttp}",
- leakCanaryDebug : "com.squareup.leakcanary:leakcanary-android:${versions.leakCanary}",
- leakCanaryRelease : "com.squareup.leakcanary:leakcanary-android-no-op:${versions.leakCanary}",
+ gmsLocation : 'com.google.android.gms:play-services-location:11.0.4',
+ timber : "com.jakewharton.timber:timber:${versions.timber}",
+ okhttp3 : "com.squareup.okhttp3:okhttp:${versions.okhttp}",
+ leakCanaryDebug : "com.squareup.leakcanary:leakcanary-android:${versions.leakCanary}",
+ leakCanaryRelease : "com.squareup.leakcanary:leakcanary-android-no-op:${versions.leakCanary}",
- kotlinLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}",
- kotlinPlugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}",
- licensesPlugin : "com.jaredsburrows:gradle-license-plugin:${versions.licenses}",
+ kotlinLib : "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}",
+ kotlinPlugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}",
+ licensesPlugin : "com.jaredsburrows:gradle-license-plugin:${versions.licenses}",
- lint : "com.android.tools.lint:lint:${versions.lint}",
- lintApi : "com.android.tools.lint:lint-api:${versions.lint}",
- lintChecks : "com.android.tools.lint:lint-checks:${versions.lint}",
- lintTests : "com.android.tools.lint:lint-tests:${versions.lint}"
+ lint : "com.android.tools.lint:lint:${versions.lint}",
+ lintApi : "com.android.tools.lint:lint-api:${versions.lint}",
+ lintChecks : "com.android.tools.lint:lint-checks:${versions.lint}",
+ lintTests : "com.android.tools.lint:lint-tests:${versions.lint}"
]
}