Replace Mapbox maps with OsmDroid

pull/1352/head
Alex Baker 3 years ago
parent f168107a31
commit b0777101e8

@ -207,9 +207,7 @@ dependencies {
implementation("com.github.QuadFlask:colorpicker:0.0.15")
implementation("com.github.openid:AppAuth-Android:27b62d5")
// https://github.com/mapbox/mapbox-gl-native-android/issues/316
genericImplementation("com.mapbox.mapboxsdk:mapbox-android-sdk:7.4.1")
genericImplementation("com.mapbox.mapboxsdk:mapbox-android-telemetry:6.1.0")
genericImplementation("org.osmdroid:osmdroid-android:6.1.10@aar")
googleplayImplementation("com.google.firebase:firebase-crashlytics:${Versions.crashlytics}")
googleplayImplementation("com.google.firebase:firebase-analytics:${Versions.analytics}") {

@ -10,8 +10,8 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ActivityScoped
import dagger.hilt.android.scopes.ViewModelScoped
import org.tasks.location.MapFragment
import org.tasks.location.MapboxMapFragment
import org.tasks.location.MapboxSearchProvider
import org.tasks.location.OsmMapFragment
import org.tasks.location.PlaceSearchProvider
@Module
@ -26,6 +26,6 @@ class LocationModule {
@Provides
@ActivityScoped
fun getMapFragment(@ApplicationContext context: Context): MapFragment {
return MapboxMapFragment(context)
return OsmMapFragment(context)
}
}

@ -1,133 +0,0 @@
package org.tasks.location;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.camera.CameraUpdate;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.location.LocationComponent;
import com.mapbox.mapboxsdk.location.modes.CameraMode;
import com.mapbox.mapboxsdk.location.modes.RenderMode;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.MapboxMap.OnMarkerClickListener;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.maps.Style;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.tasks.R;
import org.tasks.data.Place;
public class MapboxMapFragment implements MapFragment, OnMapReadyCallback, OnMarkerClickListener {
private static final String FRAG_TAG_MAP = "frag_tag_map";
private final Context context;
private MapFragmentCallback callbacks;
private boolean dark;
private MapboxMap map;
private final Map<Marker, Place> markers = new HashMap<>();
public MapboxMapFragment(Context context) {
this.context = context;
}
@Override
public void init(FragmentManager fragmentManager, MapFragmentCallback callbacks, boolean dark) {
this.callbacks = callbacks;
this.dark = dark;
Mapbox.getInstance(context, context.getString(R.string.mapbox_key));
com.mapbox.mapboxsdk.maps.SupportMapFragment mapFragment =
(com.mapbox.mapboxsdk.maps.SupportMapFragment)
fragmentManager.findFragmentByTag(FRAG_TAG_MAP);
if (mapFragment == null) {
mapFragment = new com.mapbox.mapboxsdk.maps.SupportMapFragment();
fragmentManager.beginTransaction().replace(R.id.map, mapFragment).commit();
}
mapFragment.getMapAsync(this);
}
@Override
public MapPosition getMapPosition() {
if (map == null) {
return null;
}
CameraPosition cameraPosition = map.getCameraPosition();
LatLng target = cameraPosition.target;
return new MapPosition(
target.getLatitude(), target.getLongitude(), (float) cameraPosition.zoom);
}
@Override
public void movePosition(MapPosition mapPosition, boolean animate) {
CameraUpdate cameraUpdate =
CameraUpdateFactory.newCameraPosition(
new CameraPosition.Builder()
.target(new LatLng(mapPosition.getLatitude(), mapPosition.getLongitude()))
.zoom(mapPosition.getZoom())
.build());
if (animate) {
map.animateCamera(cameraUpdate);
} else {
map.moveCamera(cameraUpdate);
}
}
@Override
public void setMarkers(List<Place> places) {
if (map == null) {
return;
}
for (Marker marker : map.getMarkers()) {
map.removeMarker(marker);
}
markers.clear();
for (Place place : places) {
Marker marker =
map.addMarker(
new MarkerOptions()
.setPosition(new LatLng(place.getLatitude(), place.getLongitude())));
markers.put(marker, place);
}
}
@Override
public void disableGestures() {
map.getUiSettings().setAllGesturesEnabled(false);
}
@SuppressLint("MissingPermission")
@Override
public void showMyLocation() {
LocationComponent locationComponent = map.getLocationComponent();
locationComponent.activateLocationComponent(context, map.getStyle());
locationComponent.setLocationComponentEnabled(true);
locationComponent.setCameraMode(CameraMode.NONE);
locationComponent.setRenderMode(RenderMode.NORMAL);
}
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {
map = mapboxMap;
map.getUiSettings().setRotateGesturesEnabled(false);
map.setOnMarkerClickListener(this);
map.setStyle(dark ? Style.DARK : Style.MAPBOX_STREETS, style -> callbacks.onMapReady(this));
}
@Override
public int getMarkerId() {
return R.id.mapbox_marker;
}
@Override
public boolean onMarkerClick(@NonNull Marker marker) {
Place place = markers.get(marker);
callbacks.onPlaceSelected(place);
return false;
}
}

@ -0,0 +1,98 @@
package org.tasks.location
import android.annotation.SuppressLint
import android.content.Context
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.preference.PreferenceManager
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint
import org.osmdroid.views.CustomZoomButtonsController
import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Marker
import org.osmdroid.views.overlay.TilesOverlay
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
import org.tasks.R
import org.tasks.data.Place
import org.tasks.location.MapFragment.MapFragmentCallback
class OsmMapFragment(private val context: Context) : MapFragment {
private lateinit var callbacks: MapFragmentCallback
private lateinit var map: MapView
private var locationOverlay: MyLocationNewOverlay? = null
override fun init(activity: AppCompatActivity, callbacks: MapFragmentCallback, dark: Boolean) {
this.callbacks = callbacks
Configuration.getInstance()
.load(activity, PreferenceManager.getDefaultSharedPreferences(activity))
map = MapView(activity).apply {
isTilesScaledToDpi = true
setTileSource(TileSourceFactory.MAPNIK)
zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER)
setMultiTouchControls(true)
if (dark) {
overlayManager.tilesOverlay.setColorFilter(TilesOverlay.INVERT_COLORS)
}
activity.findViewById<ViewGroup>(R.id.map).addView(this)
}
callbacks.onMapReady(this)
}
override fun getMapPosition(): MapPosition {
val center = map.mapCenter
return MapPosition(center.latitude, center.longitude, map.zoomLevelDouble.toFloat())
}
override fun movePosition(mapPosition: MapPosition, animate: Boolean) {
val controller = map.controller
controller.setZoom(mapPosition.zoom.toDouble())
val geoPoint = GeoPoint(mapPosition.latitude, mapPosition.longitude)
if (animate) {
controller.animateTo(geoPoint)
} else {
controller.setCenter(geoPoint)
}
}
override fun setMarkers(places: List<Place>) {
val overlays = map.overlays
overlays.removeIf { it is Marker }
for (place in places) {
overlays.add(Marker(map).apply {
position = GeoPoint(place.latitude, place.longitude)
setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER)
icon = ContextCompat.getDrawable(context, R.drawable.map_marker_padding)!!.mutate()
setOnMarkerClickListener { _, _ ->
callbacks.onPlaceSelected(place)
false
}
})
}
}
override fun disableGestures() = map.setMultiTouchControls(false)
@SuppressLint("MissingPermission")
override fun showMyLocation() {
locationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(context), map).apply {
enableMyLocation()
enableAutoStop = false
}
map.overlays.add(locationOverlay)
}
override fun onPause() {
locationOverlay?.disableMyLocation()
map.onPause()
}
override fun onResume() {
locationOverlay?.enableMyLocation()
map.onResume()
}
override fun onDestroy() = map.onDetach()
}

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="48dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<selector>
<item android:drawable="@drawable/ic_map_marker_select_red_48dp"/>
</selector>
</item>
</layer-list>

@ -2,7 +2,7 @@ package org.tasks.location
import android.annotation.SuppressLint
import android.content.Context
import androidx.fragment.app.FragmentManager
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
@ -19,9 +19,10 @@ class GoogleMapFragment(private val context: Context) : MapFragment, OnMapReadyC
private var dark = false
private var map: GoogleMap? = null
override fun init(fragmentManager: FragmentManager, callbacks: MapFragmentCallback, dark: Boolean) {
override fun init(activity: AppCompatActivity, callbacks: MapFragmentCallback, dark: Boolean) {
this.callbacks = callbacks
this.dark = dark
val fragmentManager = activity.supportFragmentManager
var mapFragment = fragmentManager.findFragmentByTag(FRAG_TAG_MAP) as SupportMapFragment?
if (mapFragment == null) {
mapFragment = SupportMapFragment()
@ -89,7 +90,11 @@ class GoogleMapFragment(private val context: Context) : MapFragment, OnMapReadyC
callbacks.onMapReady(this)
}
override fun getMarkerId() = R.id.google_marker
override fun onPause() {}
override fun onResume() {}
override fun onDestroy() {}
override fun onMarkerClick(marker: Marker): Boolean {
callbacks.onPlaceSelected(marker.tag as Place?)

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape />

@ -54,7 +54,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
selectedIcon = place.getIcon()!!
}
map.init(supportFragmentManager, this, tasksTheme.themeBase.isDarkTheme(this))
map.init(this, this, tasksTheme.themeBase.isDarkTheme(this))
updateTheme()
}

@ -140,7 +140,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
themeColor.setStatusBarColor(toolbarLayout)
themeColor.apply(toolbar)
val dark = theme.themeBase.isDarkTheme(this)
map.init(supportFragmentManager, this, dark)
map.init(this, this, dark)
val params = appBarLayout.layoutParams as CoordinatorLayout.LayoutParams
val behavior = AppBarLayout.Behavior()
behavior.setDragCallback(
@ -166,13 +166,15 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
coordinatorLayout.removeOnLayoutChangeListener(this)
locationDao
.getPlaceUsage()
.observe(this@LocationPickerActivity, Observer { places: List<PlaceUsage> -> updatePlaces(places) })
.observe(this@LocationPickerActivity) {
places: List<PlaceUsage> -> updatePlaces(places)
}
}
})
if (offset != 0) {
appBarLayout.post { expandToolbar(false) }
}
findViewById<View>(map.markerId).visibility = View.VISIBLE
findViewById<View>(R.id.google_marker).visibility = View.VISIBLE
searchAdapter = LocationSearchAdapter(viewModel.getAttributionRes(dark), this)
recentsAdapter = LocationPickerAdapter(this, inventory, colorProvider, this)
recentsAdapter!!.setHasStableIds(true)
@ -298,6 +300,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
override fun onResume() {
super.onResume()
map.onResume()
viewModel.observe(this, Observer { list: List<PlaceSearchResult?>? -> searchAdapter!!.submitList(list) }, Observer { place: Place? -> returnPlace(place) }, Observer { error: Event<String> -> handleError(error) })
disposables = CompositeDisposable(
searchSubject
@ -306,6 +309,11 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
.subscribe { query: String? -> viewModel.query(query, mapPosition) })
}
override fun onDestroy() {
super.onDestroy()
map.onDestroy()
}
private fun handleError(error: Event<String>) {
val message = error.ifUnhandled
if (!isNullOrEmpty(message)) {
@ -343,6 +351,7 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
override fun onPause() {
super.onPause()
map.onPause()
disposables!!.dispose()
}

@ -1,13 +1,13 @@
package org.tasks.location;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import org.tasks.data.Place;
public interface MapFragment {
void init(FragmentManager fragmentManager, MapFragmentCallback callback, boolean dark);
void init(AppCompatActivity activity, MapFragmentCallback callback, boolean dark);
@Nullable MapPosition getMapPosition();
@ -19,7 +19,11 @@ public interface MapFragment {
void showMyLocation();
int getMarkerId();
void onPause();
void onResume();
void onDestroy();
interface MapFragmentCallback {
void onMapReady(MapFragment mapFragment);

@ -38,18 +38,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<ImageView
android:id="@+id/mapbox_marker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/mapbox_marker_icon_default"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/map"
app:layout_constraintLeft_toLeftOf="@id/map"
app:layout_constraintRight_toRightOf="@id/map"
app:layout_constraintTop_toTopOf="@id/map"/>
<ImageView
android:id="@+id/google_marker"
android:layout_width="wrap_content"
@ -76,16 +64,6 @@
app:layout_constraintBottom_toBottomOf="@id/map"
app:layout_constraintEnd_toEndOf="@id/map"/>
<!--
This view is a hack, when using a Mapbox fragment for some reason other views
dont collapse under the status bar without this
-->
<View
android:layout_width="match_parent"
android:layout_height="0px"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<RelativeLayout
android:id="@+id/select_this_location"
android:layout_width="match_parent"

@ -15,87 +15,11 @@
++--- androidx.databinding:databinding-adapters:4.1.2
+| +--- androidx.databinding:databinding-common:4.1.2
+| \--- androidx.databinding:databinding-runtime:4.1.2 (*)
++--- com.mapbox.mapboxsdk:mapbox-android-sdk:7.4.1
+| +--- com.mapbox.mapboxsdk:mapbox-android-telemetry:4.4.1 -> 6.1.0
+| | +--- com.squareup.okhttp3:okhttp:3.12.0 -> 4.8.1
+| | | +--- com.squareup.okio:okio:2.7.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.70 -> 1.4.30
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30
+| | | | | \--- org.jetbrains:annotations:13.0 -> 16.0.1
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.70 -> 1.4.30
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.4.30 (*)
+| | +--- com.google.code.gson:gson:2.8.5 -> 2.8.6
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- com.mapbox.mapboxsdk:mapbox-android-core:3.0.0 -> 3.1.1
+| | \--- androidx.legacy:legacy-support-core-utils:1.0.0
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.core:core:1.0.0 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.2.0 (*)
+| | | +--- androidx.versionedparcelable:versionedparcelable:1.1.0
+| | | | +--- androidx.annotation:annotation:1.1.0
+| | | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+| | +--- androidx.documentfile:documentfile:1.0.0
+| | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.loader:loader:1.0.0
+| | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.2.0
+| | | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0
+| | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0
+| | | | | +--- androidx.lifecycle:lifecycle-common:2.2.0 (*)
+| | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | \--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.2.0
+| | | \--- androidx.annotation:annotation:1.1.0
+| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
+| | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | \--- androidx.print:print:1.0.0
+| | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| +--- com.mapbox.mapboxsdk:mapbox-sdk-geojson:4.6.0 -> 5.8.0
+| | \--- com.google.code.gson:gson:2.8.6
+| +--- com.mapbox.mapboxsdk:mapbox-android-gestures:0.4.2
+| | \--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| +--- com.mapbox.mapboxsdk:mapbox-sdk-turf:4.6.0
+| | \--- com.mapbox.mapboxsdk:mapbox-sdk-geojson:4.6.0 -> 5.8.0 (*)
+| +--- com.squareup.okhttp3:okhttp:3.12.0 -> 4.8.1 (*)
+| +--- com.getkeepsafe.relinker:relinker:1.3.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| \--- androidx.fragment:fragment:1.0.0 -> 1.2.5
+| +--- androidx.annotation:annotation:1.1.0
+| +--- androidx.core:core:1.1.0 -> 1.3.2 (*)
+| +--- androidx.collection:collection:1.1.0 (*)
+| +--- androidx.viewpager:viewpager:1.0.0
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | \--- androidx.customview:customview:1.0.0
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | \--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| +--- androidx.loader:loader:1.0.0 (*)
+| +--- androidx.activity:activity:1.1.0
+| | +--- androidx.annotation:annotation:1.1.0
+| | +--- androidx.core:core:1.1.0 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.2.0 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| | +--- androidx.savedstate:savedstate:1.0.0
+| | | +--- androidx.annotation:annotation:1.1.0
+| | | +--- androidx.arch.core:core-common:2.0.1 -> 2.1.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.0.0 -> 2.2.0 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0 -> 2.2.0
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.savedstate:savedstate:1.0.0 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0 (*)
++--- com.mapbox.mapboxsdk:mapbox-android-telemetry:6.1.0 (*)
++--- org.osmdroid:osmdroid-android:6.1.10
++--- com.gitlab.bitfireAT:dav4jvm:2.1.1
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.4.30 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.4.30
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30
+| | \--- org.jetbrains:annotations:13.0 -> 16.0.1
+| \--- org.apache.commons:commons-lang3:3.9
++--- com.gitlab.abaker:ical4android:0e928b567c
+| +--- org.mnode.ical4j:ical4j:3.0.21
@ -113,7 +37,13 @@
+| \--- androidx.core:core-ktx:1.3.2
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.4.30 (*)
+| +--- androidx.annotation:annotation:1.1.0
+| \--- androidx.core:core:1.3.2 (*)
+| \--- androidx.core:core:1.3.2
+| +--- androidx.annotation:annotation:1.1.0
+| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.2.0 (*)
+| +--- androidx.versionedparcelable:versionedparcelable:1.1.0
+| | +--- androidx.annotation:annotation:1.1.0
+| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+| \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
++--- com.gitlab.bitfireAT:cert4android:26a91a729f
+| +--- androidx.databinding:databinding-common:4.1.1 -> 4.1.2
+| +--- androidx.databinding:databinding-runtime:4.1.1 -> 4.1.2 (*)
@ -124,7 +54,47 @@
+| | +--- androidx.core:core:1.3.0 -> 1.3.2 (*)
+| | +--- androidx.cursoradapter:cursoradapter:1.0.0
+| | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.fragment:fragment:1.1.0 -> 1.2.5 (*)
+| | +--- androidx.fragment:fragment:1.1.0 -> 1.2.5
+| | | +--- androidx.annotation:annotation:1.1.0
+| | | +--- androidx.core:core:1.1.0 -> 1.3.2 (*)
+| | | +--- androidx.collection:collection:1.1.0 (*)
+| | | +--- androidx.viewpager:viewpager:1.0.0
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | | \--- androidx.customview:customview:1.0.0
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | | \--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.loader:loader:1.0.0
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.2.0
+| | | | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | | | +--- androidx.annotation:annotation:1.1.0
+| | | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0
+| | | | | | +--- androidx.lifecycle:lifecycle-common:2.2.0 (*)
+| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | \--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.2.0
+| | | | \--- androidx.annotation:annotation:1.1.0
+| | | +--- androidx.activity:activity:1.1.0
+| | | | +--- androidx.annotation:annotation:1.1.0
+| | | | +--- androidx.core:core:1.1.0 -> 1.3.2 (*)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.2.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| | | | +--- androidx.savedstate:savedstate:1.0.0
+| | | | | +--- androidx.annotation:annotation:1.1.0
+| | | | | +--- androidx.arch.core:core-common:2.0.1 -> 2.1.0 (*)
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.0.0 -> 2.2.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0 -> 2.2.0
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | | +--- androidx.savedstate:savedstate:1.0.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.2.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0 (*)
+| | +--- androidx.appcompat:appcompat-resources:1.2.0
+| | | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+| | | +--- androidx.annotation:annotation:1.1.0
@ -190,7 +160,16 @@
+| | +--- androidx.dynamicanimation:dynamicanimation:1.0.0
+| | | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+| | | \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
+| | | \--- androidx.legacy:legacy-support-core-utils:1.0.0
+| | | +--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | +--- androidx.core:core:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.documentfile:documentfile:1.0.0
+| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | +--- androidx.loader:loader:1.0.0 (*)
+| | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
+| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | | \--- androidx.print:print:1.0.0
+| | | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0
+| | +--- androidx.annotation:annotation-experimental:1.0.0
+| | +--- androidx.fragment:fragment:1.0.0 -> 1.2.5 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.2.0 (*)
@ -310,7 +289,11 @@
++--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.3
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 -> 1.4.30 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0 -> 1.4.30
++--- com.squareup.okhttp3:okhttp:4.8.1 (*)
++--- com.squareup.okhttp3:okhttp:4.8.1
+| +--- com.squareup.okio:okio:2.7.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.70 -> 1.4.30 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.70 -> 1.4.30
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.4.30 (*)
++--- com.google.code.gson:gson:2.8.6
++--- com.google.android.material:material:1.3.0 (*)
++--- androidx.annotation:annotation:1.1.0
@ -376,7 +359,8 @@
+| | | \--- com.google.code.gson:gson:2.8.5 -> 2.8.6
+| | \--- com.squareup.okhttp3:logging-interceptor:3.12.7
+| | \--- com.squareup.okhttp3:okhttp:3.12.7 -> 4.8.1 (*)
+| +--- com.mapbox.mapboxsdk:mapbox-sdk-geojson:5.8.0 (*)
+| +--- com.mapbox.mapboxsdk:mapbox-sdk-geojson:5.8.0
+| | \--- com.google.code.gson:gson:2.8.6
+| +--- com.mapbox.mapboxsdk:mapbox-sdk-directions-models:5.8.0
+| | +--- com.mapbox.mapboxsdk:mapbox-sdk-geojson:5.8.0 (*)
+| | \--- androidx.annotation:annotation:1.0.0 -> 1.1.0

@ -1,5 +1,4 @@
android.enableResourceOptimizations=true
android.enableJetifier=true
android.useAndroidX=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4g -Dkotlin.daemon.jvm.options="-Xmx3g" -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Loading…
Cancel
Save