From 786212fc4934547233a8880bea417247eff7662f Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Thu, 23 May 2019 14:16:49 +0300 Subject: [PATCH] Call update map and add required markers --- .../nrw/commons/nearby/NearbyController.java | 14 +-- .../mvp/contract/NearbyMapContract.java | 11 ++- .../NearbyParentFragmentContract.java | 2 + .../mvp/fragments/NearbyMapFragment.java | 88 ++++++++++++++++++- .../mvp/fragments/NearbyParentFragment.java | 27 ++++++ .../mvp/presenter/NearbyMapPresenter.java | 6 ++ .../NearbyParentFragmentPresenter.java | 23 ++++- 7 files changed, 156 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index 4cb93164a..0956a61be 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -41,21 +41,21 @@ public class NearbyController { * Prepares Place list to make their distance information update later. * * @param curLatLng current location for user - * @param latLangToSearchAround the location user wants to search around + * @param searchLatLng the location user wants to search around * @param returnClosestResult if this search is done to find closest result or all results * @return NearbyPlacesInfo a variable holds Place list without distance information * and boundary coordinates of current Place List */ - public NearbyPlacesInfo loadAttractionsFromLocation(LatLng curLatLng, LatLng latLangToSearchAround, boolean returnClosestResult, boolean checkingAroundCurrentLocation) throws IOException { + public NearbyPlacesInfo loadAttractionsFromLocation(LatLng curLatLng, LatLng searchLatLng, boolean returnClosestResult, boolean checkingAroundCurrentLocation) throws IOException { - Timber.d("Loading attractions near %s", latLangToSearchAround); + Timber.d("Loading attractions near %s", searchLatLng); NearbyPlacesInfo nearbyPlacesInfo = new NearbyPlacesInfo(); - if (latLangToSearchAround == null) { + if (searchLatLng == null) { Timber.d("Loading attractions nearby, but curLatLng is null"); return null; } - List places = nearbyPlaces.radiusExpander(latLangToSearchAround, Locale.getDefault().getLanguage(), returnClosestResult); + List places = nearbyPlaces.radiusExpander(searchLatLng, Locale.getDefault().getLanguage(), returnClosestResult); if (null != places && places.size() > 0) { LatLng[] boundaryCoordinates = {places.get(0).location, // south @@ -91,6 +91,8 @@ public class NearbyController { } ); } + nearbyPlacesInfo.curLatLng = curLatLng; + nearbyPlacesInfo.searchLatLng = searchLatLng; nearbyPlacesInfo.placeList = places; nearbyPlacesInfo.boundaryCoordinates = boundaryCoordinates; if (!returnClosestResult && checkingAroundCurrentLocation) { @@ -212,5 +214,7 @@ public class NearbyController { public class NearbyPlacesInfo { public List placeList; // List of nearby places public LatLng[] boundaryCoordinates; // Corners of nearby area + public LatLng curLatLng; // current location when this places are populated + public LatLng searchLatLng; //search location for finding this places } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java index 41a6ab621..d823033ce 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java @@ -4,8 +4,13 @@ import android.net.Uri; import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.maps.MapView; +import java.util.List; + +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.nearby.NearbyBaseMarker; import fr.free.nrw.commons.nearby.Place; /** @@ -20,14 +25,14 @@ public interface NearbyMapContract { void showSearchThisAreaButton(); void showInformationBottomSheet(); void initViews(); - void updateMapMarkers(); + void updateMapMarkers(LatLng latLng, List placeList); void updateMapToTrackPosition(); void setListeners(); MapView setupMapView(Bundle savedInstanceState); void addCurrentLocationMarker(); void setSearchThisAreaButtonVisibility(boolean visible); boolean isCurrentLocationMarkerVisible(); - void addNearbyMarkersToMapBoxMap(); + void addNearbyMarkersToMapBoxMap(List baseMarkerOptions); void prepareViewsForSheetPosition(); void hideFABs(); void showFABs(); @@ -47,7 +52,7 @@ public interface NearbyMapContract { void searchThisArea(); void storeSharedPrefs(); void recenterMap(); - void updateMapMarkers(); + void updateMapMarkers(LatLng latLng); void updateMapToTrackPosition(); void getBundleContent(); boolean addMapMovementListener(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java index 1b984dc81..a3dfe7621 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java @@ -1,6 +1,7 @@ package fr.free.nrw.commons.nearby.mvp.contract; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; public interface NearbyParentFragmentContract { @@ -16,6 +17,7 @@ public interface NearbyParentFragmentContract { boolean isNetworkConnectionEstablished(); void addNetworkBroadcastReceiver(); void listOptionMenuItemClicked(); + void populatePlaces(LatLng curlatLng, LatLng searchLatLng); boolean isBottomSheetExpanded(); } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java index d298c40e7..726c79458 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java @@ -4,6 +4,7 @@ import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.util.Log; +import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -14,28 +15,54 @@ import android.view.animation.AnimationUtils; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.MapboxMapOptions; +import com.mapbox.mapboxsdk.plugins.localization.LocalizationPlugin; + +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Named; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; +import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.nearby.NearbyBaseMarker; +import fr.free.nrw.commons.nearby.NearbyController; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; public class NearbyMapFragment extends CommonsDaggerSupportFragment implements NearbyMapContract.View { + @Inject + @Named("default_preferences") + JsonKvStore applicationKvStore; + + @Inject + BookmarkLocationsDao bookmarkLocationDao; + @BindView(R.id.bottom_sheet) View bottomSheetList; @BindView(R.id.bottom_sheet_details) View bottomSheetDetails; - MapView mapView; + public MapView mapView; + public MapboxMap mapboxMap; public NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback; private BottomSheetBehavior bottomSheetListBehavior; @@ -45,6 +72,11 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N private Animation fab_open; private Animation rotate_forward; + private static final double ZOOM_LEVEL = 14f; + + + + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -113,6 +145,38 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N @Override public MapView setupMapView(Bundle savedInstanceState) { + Log.d("deneme1","setupMapView"); + Timber.d("setupMapView called"); + boolean isDarkTheme = applicationKvStore.getBoolean("theme", false); + MapboxMapOptions options = new MapboxMapOptions() + .compassGravity(Gravity.BOTTOM | Gravity.LEFT) + .compassMargins(new int[]{12, 0, 0, 24}) + .styleUrl(isDarkTheme ? Style.DARK : Style.OUTDOORS) + .logoEnabled(false) + .attributionEnabled(false) + .camera(new CameraPosition.Builder() + .zoom(ZOOM_LEVEL) + .build()); + + if (!getParentFragment().getActivity().isFinishing()) { + MapView mapView = new MapView(getParentFragment().getActivity(), options); + // create map + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(mapboxMap -> { + LocalizationPlugin localizationPlugin = new LocalizationPlugin(mapView, mapboxMap); + + try { + localizationPlugin.matchMapLanguageWithDeviceDefault(); + } catch (RuntimeException exception) { + Timber.d(exception.toString()); + } + + this.mapboxMap = mapboxMap; + //addMapMovementListeners(); + //updateMapSignificantlyForCurrentLocation(); + }); + return mapView; + } return null; } @@ -127,12 +191,23 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } @Override - public void updateMapMarkers() { - + public void updateMapMarkers(LatLng curLatLng, List placeList) { + Log.d("deneme1","updateMapMarkers"); + List customBaseMarkerOptions = NearbyController + .loadAttractionsFromLocationToBaseMarkerOptions(curLatLng, // Curlatlang will be used to calculate distances + placeList, + getActivity(), + bookmarkLocationDao.getAllBookmarksLocations()); + mapboxMap.clear(); + // We are trying to find nearby places around our custom searched area, thus custom parameter is nonnull + addNearbyMarkersToMapBoxMap(customBaseMarkerOptions); + // Re-enable mapbox gestures on custom location markers load + mapboxMap.getUiSettings().setAllGesturesEnabled(true); } @Override public void updateMapToTrackPosition() { + //addCurrentLocationMarker(mapboxMap); } @@ -157,7 +232,7 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } @Override - public void addNearbyMarkersToMapBoxMap() { + public void addNearbyMarkersToMapBoxMap(List baseMarkerOptions) { } @@ -221,10 +296,15 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } + /** + * Means that views are set in presenter + * @param viewsAreReadyCallback + */ @Override public void viewsAreSet(NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback) { Log.d("deneme1","viewsAreSet"); this.viewsAreReadyCallback = viewsAreReadyCallback; + this.viewsAreReadyCallback.nearbyFragmentAndMapViewReady(); } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java index 2180f34f0..e21a49755 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java @@ -39,6 +39,9 @@ import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter; import fr.free.nrw.commons.utils.FragmentUtils; import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.wikidata.WikidataEditListener; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; @@ -142,6 +145,30 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment wikidataEditListener.setAuthenticationStateListener(null); } + @Override + public void populatePlaces(LatLng curlatLng, LatLng searchLatLng){ + compositeDisposable.add(Observable.fromCallable(() -> nearbyController + .loadAttractionsFromLocation(curlatLng, searchLatLng, false, true)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::updateMapMarkers, + throwable -> { + Timber.d(throwable); + //showErrorMessage(getString(R.string.error_fetching_nearby_places)); + progressBar.setVisibility(View.GONE); + })); + } + + /** + * Populates places for custom location, should be used for finding nearby places around a + * location where you are not at. + * @param nearbyPlacesInfo This variable has place list information and distances. + */ + private void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) { + nearbyParentFragmentPresenter.updateMapMarkers(nearbyPlacesInfo); + } + + /** * Resume fragments if they exists */ diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyMapPresenter.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyMapPresenter.java index be666224a..5e2e22bdc 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyMapPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyMapPresenter.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons.nearby.mvp.presenter; +import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; @@ -26,6 +27,11 @@ public class NearbyMapPresenter implements NearbyMapContract.UserActions { } @Override + public void updateMapMarkers(LatLng latLng) { + + } + + public void updateMapMarkers() { } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java index cb704a381..8b22e6803 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java @@ -1,13 +1,19 @@ package fr.free.nrw.commons.nearby.mvp.presenter; import android.util.Log; +import android.view.View; +import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.location.LocationUpdateListener; +import fr.free.nrw.commons.nearby.NearbyController; import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; import fr.free.nrw.commons.wikidata.WikidataEditListener; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import timber.log.Timber; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; @@ -35,7 +41,7 @@ public class NearbyParentFragmentPresenter LocationServiceManager locationServiceManager) { this.nearbyParentFragmentView = nearbyParentFragmentView; this.nearbyMapFragmentView = nearbyMapFragmentView; - nearbyMapFragmentView.setViewsAreReady(this); + nearbyMapFragmentView.viewsAreSet(this); this.locationServiceManager = locationServiceManager; } @@ -145,13 +151,24 @@ public class NearbyParentFragmentPresenter */ if (locationChangeType.equals(LOCATION_SIGNIFICANTLY_CHANGED) || locationChangeType.equals(MAP_UPDATED)) { - nearbyMapFragmentView.updateMapMarkers(); - nearbyMapFragmentView.updateMapToTrackPosition(); + nearbyParentFragmentView.populatePlaces(lastLocation, lastLocation); + // TODO add a search location here + } else { nearbyMapFragmentView.updateMapToTrackPosition(); } } + /** + * Populates places for custom location, should be used for finding nearby places around a + * location where you are not at. + * @param nearbyPlacesInfo This variable has place list information and distances. + */ + public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo) { + nearbyMapFragmentView.updateMapMarkers(nearbyPlacesInfo.curLatLng, nearbyPlacesInfo.placeList); + nearbyMapFragmentView.updateMapToTrackPosition(); + } + @Override public void onWikidataEditSuccessful() {