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 1c9082d3b..dbd3dbb36 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 @@ -6,6 +6,7 @@ import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; import java.util.List; @@ -47,6 +48,7 @@ public interface NearbyMapContract { void updateMarker(boolean isBookmarked, Place place); LatLng getCameraTarget(); void viewsAreSet(NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback); + void addOnCameraMoveListener(MapboxMap.OnCameraMoveListener onCameraMoveListener); } interface UserActions extends NearbyElementContract.UserActions { 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 611b5d8de..b01fb5fa2 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,10 @@ package fr.free.nrw.commons.nearby.mvp.contract; +import android.widget.Button; + +import com.mapbox.mapboxsdk.maps.MapboxMap; + import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; @@ -19,6 +23,9 @@ public interface NearbyParentFragmentContract { void listOptionMenuItemClicked(); void populatePlaces(LatLng curlatLng, LatLng searchLatLng); boolean isBottomSheetExpanded(); + void addSearchThisAreaButtonAction(); + void setSearchThisAreaButtonVisibility(boolean isVisible); + void setSearchThisAreaProgressVisibility(boolean isVisible); } interface UserActions { @@ -32,7 +39,7 @@ public interface NearbyParentFragmentContract { void lockNearby(boolean isNearbyLocked); - void addMapMovementListeners(); + MapboxMap.OnCameraMoveListener onCameraMove(LatLng cameraTarget); } interface ViewsAreReadyCallback { 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 b2d9de60e..a04ccc295 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 @@ -409,6 +409,11 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N this.viewsAreReadyCallback.nearbyFragmentAndMapViewReady(); } + @Override + public void addOnCameraMoveListener(MapboxMap.OnCameraMoveListener onCameraMoveListener) { + mapboxMap.addOnCameraMoveListener(onCameraMoveListener); + } + @Override public void showPlaces() { 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 829ed2130..d1c37242c 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 @@ -119,12 +119,6 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment return view; } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - addSearchThisAreaButtonAction(); - } - @Override public void onResume() { super.onResume(); @@ -142,15 +136,28 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment Timber.d("Child fragment attached"); } + @Override public void addSearchThisAreaButtonAction() { - searchThisAreaButton.setOnClickListener(view -> { - // Lock map operations during search this area operation - nearbyParentFragmentPresenter.lockNearby(true); - searchThisAreaButtonProgressBar.setVisibility(View.VISIBLE); + searchThisAreaButton.setOnClickListener(nearbyParentFragmentPresenter.onSearchThisAreaClicked()); + } + + @Override + public void setSearchThisAreaButtonVisibility(boolean isVisible) { + if (isVisible) { + searchThisAreaButton.setVisibility(View.VISIBLE); + } else { searchThisAreaButton.setVisibility(View.GONE); - nearbyParentFragmentPresenter.updateMapAndList(SEARCH_CUSTOM_AREA, - NearbyParentFragment.this.nearbyParentFragmentPresenter.getCameraTarget()); - }); + } + } + + + @Override + public void setSearchThisAreaProgressVisibility(boolean isVisible) { + if (isVisible) { + searchThisAreaButtonProgressBar.setVisibility(View.VISIBLE); + } else { + searchThisAreaButtonProgressBar.setVisibility(View.GONE); + } } @Override 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 be0925b22..19a6b06f0 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 @@ -2,7 +2,11 @@ package fr.free.nrw.commons.nearby.mvp.presenter; import android.util.Log; import android.view.View; +import android.widget.Button; +import com.mapbox.mapboxsdk.maps.MapboxMap; + +import ch.qos.logback.core.util.LocationUtil; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; @@ -10,6 +14,8 @@ 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.utils.LocationUtils; +import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.wikidata.WikidataEditListener; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -35,6 +41,7 @@ public class NearbyParentFragmentPresenter boolean nearbyViewsAreReady; boolean onTabSelected; + boolean searchingThisArea; private LocationServiceManager locationServiceManager; @@ -45,6 +52,10 @@ public class NearbyParentFragmentPresenter this.nearbyMapFragmentView = nearbyMapFragmentView; this.nearbyMapFragmentView.viewsAreSet(this); this.locationServiceManager = locationServiceManager; + + // Add on map camera moved listener after making sure presenter is ready + this.nearbyParentFragmentView.addSearchThisAreaButtonAction(); + this.nearbyMapFragmentView.addOnCameraMoveListener(onCameraMove(getCameraTarget())); } /** @@ -131,8 +142,55 @@ public class NearbyParentFragmentPresenter * this area button to search nearby places for other locations */ @Override - public void addMapMovementListeners() { - + public MapboxMap.OnCameraMoveListener onCameraMove(LatLng cameraTarget) { + return new MapboxMap.OnCameraMoveListener() { + @Override + public void onCameraMove() { + // If our nearby markers are calculated at least once + if (NearbyController.currentLocation != null) { + if (nearbyParentFragmentView.isNetworkConnectionEstablished()) { + nearbyParentFragmentView.setSearchThisAreaButtonVisibility(true); + } + } + } + }; + } + + public View.OnClickListener onSearchThisAreaClicked() { + return new View.OnClickListener() { + @Override + public void onClick(View v) { + // Lock map operations during search this area operation + lockNearby(true); + nearbyParentFragmentView.setSearchThisAreaProgressVisibility(true); + // TODO: make this invisible at somewhere + nearbyParentFragmentView.setSearchThisAreaButtonVisibility(false); + + if (searchCloseToCurrentLocation()){ + updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED, + null); + } else { + updateMapAndList(SEARCH_CUSTOM_AREA, + getCameraTarget()); + } + } + }; + } + + /** + * Returns true if search this area button is used around our current location, so that + * we can continue following our current location again + * @return Returns true if search this area button is used around our current location + */ + public boolean searchCloseToCurrentLocation() { + double distance = LocationUtils.commonsLatLngToMapBoxLatLng(getCameraTarget()) + .distanceTo(new com.mapbox.mapboxsdk.geometry.LatLng(NearbyController.currentLocation.getLatitude() + , NearbyController.currentLocation.getLongitude())); + if (distance > NearbyController.searchedRadius*1000*3/4) { + return false; + } else { + return true; + } } @@ -180,6 +238,7 @@ public class NearbyParentFragmentPresenter } else if (locationChangeType.equals(SEARCH_CUSTOM_AREA)) { nearbyParentFragmentView.populatePlaces(lastLocation, cameraTarget); + searchingThisArea = false; } else { // Means location changed slightly, ie user is walking or driving.