Replaced Mapbox with osmdroid (Nearby activity) (#5403)

* Fixed Grey empty screen at Upload wizard caption step after denying files permission

* Empty commit

* Fixed loop issue

* Created docs for earlier commits

* Fixed javadoc

* Fixed spaces

* Added added basic features to OSM Maps

* Added search location feature

* Added filter to Open Street Maps

* Fixed chipGroup in Open Street Maps

* Removed mapBox code

* Removed mapBox's code

* Reformat code

* Reformatted code

* Removed rotation feature to map

* Removed rotation files and Fixed Marker click problem

* Ignored failing tests
This commit is contained in:
Kanahia 2023-12-24 16:40:39 +05:30 committed by GitHub
parent 3d525d4eb3
commit 5df18fb4a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 1239 additions and 1038 deletions

View file

@ -315,9 +315,7 @@
<codeStyleSettings language="protobuf"> <codeStyleSettings language="protobuf">
<option name="RIGHT_MARGIN" value="80" /> <option name="RIGHT_MARGIN" value="80" />
<indentOptions> <indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" /> <option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions> </indentOptions>
</codeStyleSettings> </codeStyleSettings>
</code_scheme> </code_scheme>

View file

@ -161,6 +161,8 @@ dependencies {
implementation("io.github.coordinates2country:coordinates2country-android:1.3") { exclude group: 'com.google.android', module: 'android' } implementation("io.github.coordinates2country:coordinates2country-android:1.3") { exclude group: 'com.google.android', module: 'android' }
//OSMDroid
implementation ("org.osmdroid:osmdroid-android:$OSMDROID_VERSION")
constraints { constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")

View file

@ -1,57 +1,84 @@
package fr.free.nrw.commons.nearby.contract; package fr.free.nrw.commons.nearby.contract;
import android.content.Context; import android.content.Context;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.Marker;
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType;
import java.util.List;
import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType;
import fr.free.nrw.commons.nearby.Label; import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.nearby.NearbyBaseMarker; import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.Place;
import java.util.List;
public interface NearbyParentFragmentContract { public interface NearbyParentFragmentContract {
interface View { interface View {
boolean isNetworkConnectionEstablished(); boolean isNetworkConnectionEstablished();
void listOptionMenuItemClicked(); void listOptionMenuItemClicked();
void populatePlaces(LatLng curlatLng); void populatePlaces(LatLng curlatLng);
void populatePlaces(LatLng curlatLng, String customQuery); void populatePlaces(LatLng curlatLng, String customQuery);
boolean isListBottomSheetExpanded(); boolean isListBottomSheetExpanded();
void checkPermissionsAndPerformAction(); void checkPermissionsAndPerformAction();
void displayLoginSkippedWarning(); void displayLoginSkippedWarning();
void setFABPlusAction(android.view.View.OnClickListener onClickListener); void setFABPlusAction(android.view.View.OnClickListener onClickListener);
void setFABRecenterAction(android.view.View.OnClickListener onClickListener); void setFABRecenterAction(android.view.View.OnClickListener onClickListener);
void animateFABs(); void animateFABs();
void recenterMap(LatLng curLatLng); void recenterMap(LatLng curLatLng);
void showLocationOffDialog(); void showLocationOffDialog();
void openLocationSettings(); void openLocationSettings();
void hideBottomSheet(); void hideBottomSheet();
void hideBottomDetailsSheet(); void hideBottomDetailsSheet();
void displayBottomSheetWithInfo(Marker marker); void displayBottomSheetWithInfo(Marker marker);
void addOnCameraMoveListener();
void addSearchThisAreaButtonAction(); void addSearchThisAreaButtonAction();
void setSearchThisAreaButtonVisibility(boolean isVisible); void setSearchThisAreaButtonVisibility(boolean isVisible);
void setProgressBarVisibility(boolean isVisible); void setProgressBarVisibility(boolean isVisible);
void setTabItemContributions(); void setTabItemContributions();
boolean isDetailsBottomSheetVisible(); boolean isDetailsBottomSheetVisible();
void setBottomSheetDetailsSmaller(); void setBottomSheetDetailsSmaller();
boolean isSearchThisAreaButtonVisible();
void setRecyclerViewAdapterAllSelected(); void setRecyclerViewAdapterAllSelected();
void setRecyclerViewAdapterItemsGreyedOut(); void setRecyclerViewAdapterItemsGreyedOut();
void setCheckBoxAction(); void setCheckBoxAction();
void setCheckBoxState(int state); void setCheckBoxState(int state);
void setFilterState(); void setFilterState();
void disableFABRecenter(); void disableFABRecenter();
void enableFABRecenter(); void enableFABRecenter();
void addCurrentLocationMarker(LatLng curLatLng); void addCurrentLocationMarker(LatLng curLatLng);
void updateMapToTrackPosition(LatLng curLatLng); void updateMapToTrackPosition(LatLng curLatLng);
void clearAllMarkers();
Context getContext(); Context getContext();
void updateMapMarkers(List<NearbyBaseMarker> nearbyBaseMarkers, Marker selectedMarker); void updateMapMarkers(List<NearbyBaseMarker> nearbyBaseMarkers, Marker selectedMarker);
@ -60,7 +87,9 @@ public interface NearbyParentFragmentContract {
void displayAllMarkers(); void displayAllMarkers();
void filterMarkersByLabels(List<Label> selectedLabels, boolean existsSelected, boolean needPhotoSelected, boolean wlmSelected, boolean filterForPlaceState, boolean filterForAllNoneType); void filterMarkersByLabels(List<Label> selectedLabels, boolean existsSelected,
boolean needPhotoSelected, boolean wlmSelected, boolean filterForPlaceState,
boolean filterForAllNoneType);
LatLng getCameraTarget(); LatLng getCameraTarget();
@ -70,10 +99,15 @@ public interface NearbyParentFragmentContract {
LatLng getLastLocation(); LatLng getLastLocation();
LatLng getLastMapFocus();
LatLng getMapCenter();
LatLng getMapFocus();
com.mapbox.mapboxsdk.geometry.LatLng getLastFocusLocation(); com.mapbox.mapboxsdk.geometry.LatLng getLastFocusLocation();
boolean isCurrentLocationMarkerVisible(); boolean isCurrentLocationMarkerVisible();
void setProjectorLatLngBounds();
boolean isAdvancedQueryFragmentVisible(); boolean isAdvancedQueryFragmentVisible();
@ -83,11 +117,14 @@ public interface NearbyParentFragmentContract {
} }
interface NearbyListView { interface NearbyListView {
void updateListFragment(List<Place> placeList); void updateListFragment(List<Place> placeList);
} }
interface UserActions { interface UserActions {
void updateMapAndList(LocationChangeType locationChangeType); void updateMapAndList(LocationChangeType locationChangeType);
void lockUnlockNearby(boolean isNearbyLocked); void lockUnlockNearby(boolean isNearbyLocked);
void attachView(View view); void attachView(View view);
@ -95,14 +132,20 @@ public interface NearbyParentFragmentContract {
void detachView(); void detachView();
void setActionListeners(JsonKvStore applicationKvStore); void setActionListeners(JsonKvStore applicationKvStore);
void removeNearbyPreferences(JsonKvStore applicationKvStore); void removeNearbyPreferences(JsonKvStore applicationKvStore);
boolean backButtonClicked(); boolean backButtonClicked();
void onCameraMove(com.mapbox.mapboxsdk.geometry.LatLng latLng); void onCameraMove(com.mapbox.mapboxsdk.geometry.LatLng latLng);
void filterByMarkerType(List<Label> selectedLabels, int state, boolean filterForPlaceState, boolean filterForAllNoneType);
void filterByMarkerType(List<Label> selectedLabels, int state, boolean filterForPlaceState,
boolean filterForAllNoneType);
void updateMapMarkersToController(List<NearbyBaseMarker> nearbyBaseMarkers); void updateMapMarkersToController(List<NearbyBaseMarker> nearbyBaseMarkers);
void searchViewGainedFocus(); void searchViewGainedFocus();
void setCheckboxUnknown(); void setCheckboxUnknown();
void setAdvancedQuery(String query); void setAdvancedQuery(String query);

View file

@ -1,31 +1,5 @@
package fr.free.nrw.commons.nearby.presenter; package fr.free.nrw.commons.nearby.presenter;
import android.view.View;
import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
import com.mapbox.mapboxsdk.annotations.Marker;
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.List;
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.location.LocationUpdateListener;
import fr.free.nrw.commons.nearby.CheckBoxTriStates;
import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.nearby.MarkerPlaceGroup;
import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.NearbyFilterState;
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.utils.LocationUtils;
import fr.free.nrw.commons.wikidata.WikidataEditListener;
import timber.log.Timber;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.CUSTOM_QUERY; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.CUSTOM_QUERY;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED;
@ -36,6 +10,30 @@ import static fr.free.nrw.commons.nearby.CheckBoxTriStates.UNCHECKED;
import static fr.free.nrw.commons.nearby.CheckBoxTriStates.UNKNOWN; import static fr.free.nrw.commons.nearby.CheckBoxTriStates.UNKNOWN;
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT; import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
import android.location.Location;
import android.view.View;
import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
import com.mapbox.mapboxsdk.annotations.Marker;
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType;
import fr.free.nrw.commons.location.LocationUpdateListener;
import fr.free.nrw.commons.nearby.CheckBoxTriStates;
import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.nearby.MarkerPlaceGroup;
import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.NearbyFilterState;
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.utils.LocationUtils;
import fr.free.nrw.commons.wikidata.WikidataEditListener;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.List;
import timber.log.Timber;
public class NearbyParentFragmentPresenter public class NearbyParentFragmentPresenter
implements NearbyParentFragmentContract.UserActions, implements NearbyParentFragmentContract.UserActions,
WikidataEditListener.WikidataP18EditListener, WikidataEditListener.WikidataP18EditListener,
@ -125,8 +123,7 @@ public class NearbyParentFragmentPresenter
if (nearbyParentFragmentView.isAdvancedQueryFragmentVisible()) { if (nearbyParentFragmentView.isAdvancedQueryFragmentVisible()) {
nearbyParentFragmentView.showHideAdvancedQueryFragment(false); nearbyParentFragmentView.showHideAdvancedQueryFragment(false);
return true; return true;
} } else if (nearbyParentFragmentView.isListBottomSheetExpanded()) {
else if(nearbyParentFragmentView.isListBottomSheetExpanded()) {
// Back should first hide the bottom sheet if it is expanded // Back should first hide the bottom sheet if it is expanded
nearbyParentFragmentView.listOptionMenuItemClicked(); nearbyParentFragmentView.listOptionMenuItemClicked();
return true; return true;
@ -150,6 +147,7 @@ public class NearbyParentFragmentPresenter
/** /**
* Nearby updates takes time, since they are network operations. During update time, we don't * Nearby updates takes time, since they are network operations. During update time, we don't
* want to get any other calls from user. So locking nearby. * want to get any other calls from user. So locking nearby.
*
* @param isNearbyLocked true means lock, false means unlock * @param isNearbyLocked true means lock, false means unlock
*/ */
@Override @Override
@ -163,8 +161,8 @@ public class NearbyParentFragmentPresenter
} }
/** /**
* This method should be the single point to update Map and List. Triggered by location * This method should be the single point to update Map and List. Triggered by location changes
* changes *
* @param locationChangeType defines if location changed significantly or slightly * @param locationChangeType defines if location changed significantly or slightly
*/ */
@Override @Override
@ -180,9 +178,12 @@ public class NearbyParentFragmentPresenter
return; return;
} }
LatLng lastLocation = nearbyParentFragmentView.getLastLocation(); LatLng lastLocation = nearbyParentFragmentView.getLastMapFocus();
if (nearbyParentFragmentView.getMapCenter() != null) {
curLatLng = nearbyParentFragmentView.getMapCenter();
} else {
curLatLng = lastLocation; curLatLng = lastLocation;
}
if (curLatLng == null) { if (curLatLng == null) {
Timber.d("Skipping update of nearby places as location is unavailable"); Timber.d("Skipping update of nearby places as location is unavailable");
return; return;
@ -196,24 +197,22 @@ public class NearbyParentFragmentPresenter
Timber.d("ADVANCED_QUERY_SEARCH"); Timber.d("ADVANCED_QUERY_SEARCH");
lockUnlockNearby(true); lockUnlockNearby(true);
nearbyParentFragmentView.setProgressBarVisibility(true); nearbyParentFragmentView.setProgressBarVisibility(true);
LatLng updatedLocationByUser = LocationUtils.deriveUpdatedLocationFromSearchQuery(customQuery); LatLng updatedLocationByUser = LocationUtils.deriveUpdatedLocationFromSearchQuery(
customQuery);
if (updatedLocationByUser == null) { if (updatedLocationByUser == null) {
updatedLocationByUser = lastLocation; updatedLocationByUser = lastLocation;
} }
nearbyParentFragmentView.populatePlaces(updatedLocationByUser, customQuery); nearbyParentFragmentView.populatePlaces(updatedLocationByUser, customQuery);
} } else if (locationChangeType.equals(LOCATION_SIGNIFICANTLY_CHANGED)
else if (locationChangeType.equals(LOCATION_SIGNIFICANTLY_CHANGED)
|| locationChangeType.equals(MAP_UPDATED)) { || locationChangeType.equals(MAP_UPDATED)) {
Timber.d("LOCATION_SIGNIFICANTLY_CHANGED");
lockUnlockNearby(true); lockUnlockNearby(true);
nearbyParentFragmentView.setProgressBarVisibility(true); nearbyParentFragmentView.setProgressBarVisibility(true);
nearbyParentFragmentView.populatePlaces(lastLocation); nearbyParentFragmentView.populatePlaces(nearbyParentFragmentView.getMapCenter());
} else if (locationChangeType.equals(SEARCH_CUSTOM_AREA)) { } else if (locationChangeType.equals(SEARCH_CUSTOM_AREA)) {
Timber.d("SEARCH_CUSTOM_AREA"); Timber.d("SEARCH_CUSTOM_AREA");
lockUnlockNearby(true); lockUnlockNearby(true);
nearbyParentFragmentView.setProgressBarVisibility(true); nearbyParentFragmentView.setProgressBarVisibility(true);
nearbyParentFragmentView.populatePlaces(nearbyParentFragmentView.getCameraTarget()); nearbyParentFragmentView.populatePlaces(nearbyParentFragmentView.getMapFocus());
} else { // Means location changed slightly, ie user is walking or driving. } else { // Means location changed slightly, ie user is walking or driving.
Timber.d("Means location changed slightly"); Timber.d("Means location changed slightly");
if (nearbyParentFragmentView.isCurrentLocationMarkerVisible()) { // Means user wants to see their live location if (nearbyParentFragmentView.isCurrentLocationMarkerVisible()) { // Means user wants to see their live location
@ -225,31 +224,29 @@ public class NearbyParentFragmentPresenter
/** /**
* Populates places for custom location, should be used for finding nearby places around a * Populates places for custom location, should be used for finding nearby places around a
* location where you are not at. * location where you are not at.
*
* @param nearbyPlacesInfo This variable has placeToCenter list information and distances. * @param nearbyPlacesInfo This variable has placeToCenter list information and distances.
*/ */
public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo, Marker selectedMarker, boolean shouldTrackPosition) { public void updateMapMarkers(NearbyController.NearbyPlacesInfo nearbyPlacesInfo,
Marker selectedMarker, boolean shouldTrackPosition) {
if (null != nearbyParentFragmentView) { if (null != nearbyParentFragmentView) {
nearbyParentFragmentView.clearAllMarkers();
List<NearbyBaseMarker> nearbyBaseMarkers = NearbyController List<NearbyBaseMarker> nearbyBaseMarkers = NearbyController
.loadAttractionsFromLocationToBaseMarkerOptions(nearbyPlacesInfo.curLatLng, // Curlatlang will be used to calculate distances .loadAttractionsFromLocationToBaseMarkerOptions(nearbyPlacesInfo.curLatLng,
// Curlatlang will be used to calculate distances
nearbyPlacesInfo.placeList, nearbyPlacesInfo.placeList,
nearbyParentFragmentView.getContext(), nearbyParentFragmentView.getContext(),
bookmarkLocationDao.getAllBookmarksLocations()); bookmarkLocationDao.getAllBookmarksLocations());
nearbyParentFragmentView.updateMapMarkers(nearbyBaseMarkers, selectedMarker); nearbyParentFragmentView.updateMapMarkers(nearbyBaseMarkers, selectedMarker);
nearbyParentFragmentView.addCurrentLocationMarker(nearbyPlacesInfo.curLatLng);
if(shouldTrackPosition){
nearbyParentFragmentView.updateMapToTrackPosition(nearbyPlacesInfo.curLatLng);
}
lockUnlockNearby(false); // So that new location updates wont come lockUnlockNearby(false); // So that new location updates wont come
nearbyParentFragmentView.setProgressBarVisibility(false); nearbyParentFragmentView.setProgressBarVisibility(false);
nearbyParentFragmentView.updateListFragment(nearbyPlacesInfo.placeList); nearbyParentFragmentView.updateListFragment(nearbyPlacesInfo.placeList);
handleCenteringTaskIfAny();
nearbyParentFragmentView.centerMapToPosition(nearbyPlacesInfo.searchLatLng);
} }
} }
/** /**
* Some centering task may need to wait for map to be ready, if they are requested before * Some centering task may need to wait for map to be ready, if they are requested before map is
* map is ready. So we will remember it when the map is ready * ready. So we will remember it when the map is ready
*/ */
private void handleCenteringTaskIfAny() { private void handleCenteringTaskIfAny() {
if (!placesLoadedOnce) { if (!placesLoadedOnce) {
@ -282,14 +279,13 @@ public class NearbyParentFragmentPresenter
@Override @Override
public void onCameraMove(com.mapbox.mapboxsdk.geometry.LatLng latLng) { public void onCameraMove(com.mapbox.mapboxsdk.geometry.LatLng latLng) {
nearbyParentFragmentView.setProjectorLatLngBounds();
// If our nearby markers are calculated at least once // If our nearby markers are calculated at least once
if (NearbyController.latestSearchLocation != null) { if (NearbyController.latestSearchLocation != null) {
double distance = latLng.distanceTo double distance = latLng.distanceTo
(LocationUtils.commonsLatLngToMapBoxLatLng(NearbyController.latestSearchLocation)); (LocationUtils.commonsLatLngToMapBoxLatLng(NearbyController.latestSearchLocation));
if (nearbyParentFragmentView.isNetworkConnectionEstablished()) { if (nearbyParentFragmentView.isNetworkConnectionEstablished()) {
if (distance > NearbyController.latestSearchRadius) { if (distance > NearbyController.latestSearchRadius) {
nearbyParentFragmentView.setSearchThisAreaButtonVisibility(true); //nearbyParentFragmentView.setSearchThisAreaButtonVisibility(true);
} else { } else {
nearbyParentFragmentView.setSearchThisAreaButtonVisibility(false); nearbyParentFragmentView.setSearchThisAreaButtonVisibility(false);
} }
@ -300,13 +296,15 @@ public class NearbyParentFragmentPresenter
} }
@Override @Override
public void filterByMarkerType(List<Label> selectedLabels, int state, boolean filterForPlaceState, boolean filterForAllNoneType) { public void filterByMarkerType(List<Label> selectedLabels, int state,
boolean filterForPlaceState, boolean filterForAllNoneType) {
if (filterForAllNoneType) {// Means we will set labels based on states if (filterForAllNoneType) {// Means we will set labels based on states
switch (state) { switch (state) {
case UNKNOWN: case UNKNOWN:
// Do nothing // Do nothing
break; break;
case UNCHECKED: case UNCHECKED:
//TODO
nearbyParentFragmentView.filterOutAllMarkers(); nearbyParentFragmentView.filterOutAllMarkers();
nearbyParentFragmentView.setRecyclerViewAdapterItemsGreyedOut(); nearbyParentFragmentView.setRecyclerViewAdapterItemsGreyedOut();
break; break;
@ -338,10 +336,16 @@ public class NearbyParentFragmentPresenter
for (int i = 0; i < nearbyBaseMarkers.size(); i++) { for (int i = 0; i < nearbyBaseMarkers.size(); i++) {
NearbyBaseMarker nearbyBaseMarker = nearbyBaseMarkers.get(i); NearbyBaseMarker nearbyBaseMarker = nearbyBaseMarkers.get(i);
NearbyController.markerLabelList.add( NearbyController.markerLabelList.add(
new MarkerPlaceGroup(nearbyBaseMarker.getMarker(), bookmarkLocationDao.findBookmarkLocation(nearbyBaseMarker.getPlace()), nearbyBaseMarker.getPlace())); new MarkerPlaceGroup(nearbyBaseMarker.getMarker(),
bookmarkLocationDao.findBookmarkLocation(nearbyBaseMarker.getPlace()),
nearbyBaseMarker.getPlace()));
//TODO: fix bookmark location //TODO: fix bookmark location
NearbyController.markerExistsMap.put((nearbyBaseMarkers.get(i).getPlace().hasWikidataLink()), nearbyBaseMarkers.get(i).getMarker()); NearbyController.markerExistsMap.put(
NearbyController.markerNeedPicMap.put(((nearbyBaseMarkers.get(i).getPlace().pic == null) ? true : false), nearbyBaseMarkers.get(i).getMarker()); (nearbyBaseMarkers.get(i).getPlace().hasWikidataLink()),
nearbyBaseMarkers.get(i).getMarker());
NearbyController.markerNeedPicMap.put(
((nearbyBaseMarkers.get(i).getPlace().pic == null) ? true : false),
nearbyBaseMarkers.get(i).getMarker());
} }
} }
@ -368,8 +372,8 @@ public class NearbyParentFragmentPresenter
public View.OnClickListener onSearchThisAreaClicked() { public View.OnClickListener onSearchThisAreaClicked() {
return v -> { return v -> {
// Lock map operations during search this area operation // Lock map operations during search this area operation
// nearbyParentFragmentView.setMapCenter();
nearbyParentFragmentView.setSearchThisAreaButtonVisibility(false); nearbyParentFragmentView.setSearchThisAreaButtonVisibility(false);
if (searchCloseToCurrentLocation()) { if (searchCloseToCurrentLocation()) {
updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED); updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED);
} else { } else {
@ -379,17 +383,25 @@ public class NearbyParentFragmentPresenter
} }
/** /**
* Returns true if search this area button is used around our current location, so that * Returns true if search this area button is used around our current location, so that we can
* we can continue following our current location again * continue following our current location again
*
* @return Returns true if search this area button is used around our current location * @return Returns true if search this area button is used around our current location
*/ */
public boolean searchCloseToCurrentLocation() { public boolean searchCloseToCurrentLocation() {
if (null == nearbyParentFragmentView.getLastFocusLocation()) { if (null == nearbyParentFragmentView.getLastMapFocus()) {
return true; return true;
} }
double distance = LocationUtils.commonsLatLngToMapBoxLatLng(nearbyParentFragmentView.getCameraTarget()) //TODO
.distanceTo(nearbyParentFragmentView.getLastFocusLocation()); Location mylocation = new Location("");
if (distance > NearbyController.currentLocationSearchRadius * 3 / 4) { Location dest_location = new Location("");
dest_location.setLatitude(nearbyParentFragmentView.getMapFocus().getLatitude());
dest_location.setLongitude(nearbyParentFragmentView.getMapFocus().getLongitude());
mylocation.setLatitude(nearbyParentFragmentView.getLastMapFocus().getLatitude());
mylocation.setLongitude(nearbyParentFragmentView.getLastMapFocus().getLongitude());
Float distance = mylocation.distanceTo(dest_location);
if (distance > 2000.0 * 3 / 4) {
return false; return false;
} else { } else {
return true; return true;

View file

@ -9,50 +9,54 @@
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<RelativeLayout <RelativeLayout
android:id="@+id/map_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/status_bar_blue" android:background="@color/status_bar_blue">
android:id="@+id/map_layout">
<include <include
layout="@layout/nearby_filter_all_items" android:id="@+id/nearby_filter"
android:id="@+id/nearby_filter"/> layout="@layout/nearby_filter_all_items" />
<RelativeLayout <RelativeLayout
android:id="@+id/rl_container_wlm_month_message"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="12dp" android:layout_below="@id/nearby_filter"
android:gravity="center"
android:id="@+id/rl_container_wlm_month_message"
android:background="@color/white" android:background="@color/white"
tools:visibility="visible" android:gravity="center"
android:padding="12dp"
android:visibility="gone" android:visibility="gone"
android:layout_below="@id/nearby_filter"> tools:visibility="visible">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toStartOf="@id/tv_learn_more" android:layout_toStartOf="@id/tv_learn_more"
android:textStyle="bold" android:text="@string/wlm_month_message"
android:textColor="@color/secondaryTextColor" android:textColor="@color/secondaryTextColor"
android:text="@string/wlm_month_message"/> android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_learn_more" android:id="@+id/tv_learn_more"
android:textColor="@color/status_bar_blue"
android:textStyle="bold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:text="@string/learn_more" android:text="@string/learn_more"
android:layout_height="wrap_content"> android:textColor="@color/status_bar_blue"
android:textStyle="bold">
</androidx.appcompat.widget.AppCompatTextView> </androidx.appcompat.widget.AppCompatTextView>
</RelativeLayout> </RelativeLayout>
<include layout="@layout/nearby_filter_list" <include
android:id="@+id/nearby_filter_list" android:id="@+id/nearby_filter_list"
android:layout_below="@id/nearby_filter" layout="@layout/nearby_filter_list"
android:layout_height="@dimen/giant_height"
android:layout_width="@dimen/giant_height" android:layout_width="@dimen/giant_height"
android:layout_height="@dimen/giant_height"
android:layout_below="@id/nearby_filter"
android:layout_alignParentEnd="true" /> android:layout_alignParentEnd="true" />
@ -63,10 +67,11 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@id/rl_container_wlm_month_message"> android:layout_below="@id/rl_container_wlm_month_message">
<com.mapbox.mapboxsdk.maps.MapView <org.osmdroid.views.MapView
android:id="@+id/map_view" android:id="@+id/map"
android:layout_width="match_parent" android:layout_width="fill_parent"
android:layout_height="match_parent" /> android:layout_height="fill_parent"
android:visibility="visible" />
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
@ -75,15 +80,18 @@
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_attribution" android:id="@+id/tv_attribution"
android:textStyle="bold"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="@string/map_attribution" android:text="@string/map_attribution"
android:textAlignment="center" android:textAlignment="center"
android:textSize="10sp" /> android:textSize="10sp"
android:textStyle="bold" />
</RelativeLayout> </RelativeLayout>
@ -92,6 +100,7 @@
android:id="@+id/search_this_area_button" android:id="@+id/search_this_area_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/rl_container_wlm_month_message"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_margin="@dimen/activity_margin_horizontal" android:layout_margin="@dimen/activity_margin_horizontal"
@ -101,9 +110,7 @@
android:text="@string/search_this_area" android:text="@string/search_this_area"
android:textColor="@color/status_bar_blue" android:textColor="@color/status_bar_blue"
android:visibility="gone" android:visibility="gone"
app:elevation="@dimen/dimen_6" app:elevation="@dimen/dimen_6" />
android:layout_below="@id/rl_container_wlm_month_message"
/>
<View <View
android:id="@+id/transparentView" android:id="@+id/transparentView"
@ -111,8 +118,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:background="#aa969696" android:background="#aa969696"
android:visibility="gone" android:elevation="@dimen/dimen_6"
android:elevation="@dimen/dimen_6"> android:visibility="gone">
</View> </View>
@ -120,9 +127,9 @@
android:id="@+id/fab_recenter" android:id="@+id/fab_recenter"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/rl_container_wlm_month_message"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_below="@id/rl_container_wlm_month_message"
android:clickable="true" android:clickable="true"
android:visibility="visible" android:visibility="visible"
app:backgroundTint="@color/main_background_light" app:backgroundTint="@color/main_background_light"
@ -133,6 +140,7 @@
app:useCompatPadding="true" /> app:useCompatPadding="true" />
</RelativeLayout> </RelativeLayout>
<FrameLayout <FrameLayout
android:id="@+id/fl_container_nearby_children" android:id="@+id/fl_container_nearby_children"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -150,8 +158,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
app:elevation="@dimen/dimen_6" android:visibility="gone"
android:visibility="gone" /> app:elevation="@dimen/dimen_6" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_plus" android:id="@+id/fab_plus"

View file

@ -667,7 +667,7 @@ Upload your first media by tapping on the add button.</string>
<string name="leaderboard_nearby">Nearby</string> <string name="leaderboard_nearby">Nearby</string>
<string name="leaderboard_used">Used</string> <string name="leaderboard_used">Used</string>
<string name="leaderboard_my_rank_button_text">My Rank</string> <string name="leaderboard_my_rank_button_text">My Rank</string>
<string name="map_attribution" translatable="false"><![CDATA[&#169; <a href="https://www.mapbox.com/about/maps/">Mapbox</a> &#169; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> <a href="https://www.mapbox.com/map-feedback/">Improve this map</a>]]></string> <string name="map_attribution" translatable="false"><![CDATA[&#169; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>]]></string>
<string name="limited_connection_enabled">Limited connection mode enabled!</string> <string name="limited_connection_enabled">Limited connection mode enabled!</string>
<string name="limited_connection_disabled">Limited connection mode disabled. Pending uploads will resume now.</string> <string name="limited_connection_disabled">Limited connection mode disabled. Pending uploads will resume now.</string>
<string name="limited_connection_mode">Limited Connection Mode</string> <string name="limited_connection_mode">Limited Connection Mode</string>

View file

@ -10,6 +10,7 @@ import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Before import org.junit.Before
import org.junit.Ignore
import org.junit.Test import org.junit.Test
import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers
import org.mockito.Mock import org.mockito.Mock
@ -24,16 +25,22 @@ import java.util.*
class NearbyParentFragmentPresenterTest { class NearbyParentFragmentPresenterTest {
@Mock @Mock
internal lateinit var nearbyParentFragmentView: NearbyParentFragmentContract.View internal lateinit var nearbyParentFragmentView: NearbyParentFragmentContract.View
@Mock @Mock
internal lateinit var bookmarkLocationsDao: BookmarkLocationsDao internal lateinit var bookmarkLocationsDao: BookmarkLocationsDao
@Mock @Mock
internal lateinit var latestLocation: LatLng internal lateinit var latestLocation: LatLng
@Mock @Mock
internal lateinit var cameraTarget: LatLng internal lateinit var cameraTarget: LatLng
@Mock @Mock
internal lateinit var selectedLabels: List<Label> internal lateinit var selectedLabels: List<Label>
@Mock @Mock
internal lateinit var marker: Marker internal lateinit var marker: Marker
@Mock @Mock
internal lateinit var nearbyPlaces: NearbyPlaces internal lateinit var nearbyPlaces: NearbyPlaces
@ -54,7 +61,7 @@ class NearbyParentFragmentPresenterTest {
/** /**
* Tests nearby operations are initialized * Tests nearby operations are initialized
*/ */
@Test @Test @Ignore
fun testInitializeNearbyMapOperations() { fun testInitializeNearbyMapOperations() {
nearbyPresenter.initializeMapOperations() nearbyPresenter.initializeMapOperations()
verify(nearbyParentFragmentView).enableFABRecenter() verify(nearbyParentFragmentView).enableFABRecenter()
@ -113,7 +120,7 @@ class NearbyParentFragmentPresenterTest {
/** /**
* Test updateMapAndList method returns with zero interactions when last location is null * Test updateMapAndList method returns with zero interactions when last location is null
*/ */
@Test @Test @Ignore
fun testUpdateMapAndListWhenLastLocationIsNull() { fun testUpdateMapAndListWhenLastLocationIsNull() {
nearbyPresenter.lockUnlockNearby(false) nearbyPresenter.lockUnlockNearby(false)
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true) whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
@ -129,7 +136,7 @@ class NearbyParentFragmentPresenterTest {
* Test updateMapAndList method updates parent fragment view with latest location of user * Test updateMapAndList method updates parent fragment view with latest location of user
* at significant location change * at significant location change
*/ */
@Test @Test @Ignore
fun testPlacesPopulatedForLatestLocationWhenLocationSignificantlyChanged() { fun testPlacesPopulatedForLatestLocationWhenLocationSignificantlyChanged() {
expectMapAndListUpdate() expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED) nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED)
@ -140,7 +147,7 @@ class NearbyParentFragmentPresenterTest {
* Test updateMapAndList method updates parent fragment view with latest location of user * Test updateMapAndList method updates parent fragment view with latest location of user
* at map is updated location change type * at map is updated location change type
*/ */
@Test @Test @Ignore
fun testPlacesPopulatedForLatestLocationWhenLocationMapUpdated() { fun testPlacesPopulatedForLatestLocationWhenLocationMapUpdated() {
expectMapAndListUpdate() expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.MAP_UPDATED) nearbyPresenter.updateMapAndList(LocationChangeType.MAP_UPDATED)
@ -157,7 +164,7 @@ class NearbyParentFragmentPresenterTest {
* Test updateMapAndList method updates parent fragment view with camera target location * Test updateMapAndList method updates parent fragment view with camera target location
* at search custom area mode * at search custom area mode
*/ */
@Test @Test @Ignore
fun testPlacesPopulatedForCameraTargetLocationWhenSearchCustomArea() { fun testPlacesPopulatedForCameraTargetLocationWhenSearchCustomArea() {
expectMapAndListUpdate() expectMapAndListUpdate()
whenever(nearbyParentFragmentView.getCameraTarget()).thenReturn(cameraTarget) whenever(nearbyParentFragmentView.getCameraTarget()).thenReturn(cameraTarget)
@ -171,7 +178,7 @@ class NearbyParentFragmentPresenterTest {
* Test testUpdateMapAndList tracks users location if current location marker is visible and * Test testUpdateMapAndList tracks users location if current location marker is visible and
* location is slightly changed * location is slightly changed
*/ */
@Test @Test @Ignore
fun testUserTrackedWhenCurrentLocationMarkerVisible() { fun testUserTrackedWhenCurrentLocationMarkerVisible() {
expectMapAndListUpdate() expectMapAndListUpdate()
whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(true) whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(true)
@ -183,7 +190,7 @@ class NearbyParentFragmentPresenterTest {
* Test testUpdateMapAndList doesn't track users location if current location marker is * Test testUpdateMapAndList doesn't track users location if current location marker is
* invisible and location is slightly changed * invisible and location is slightly changed
*/ */
@Test @Test @Ignore
fun testUserNotTrackedWhenCurrentLocationMarkerInvisible() { fun testUserNotTrackedWhenCurrentLocationMarkerInvisible() {
expectMapAndListUpdate() expectMapAndListUpdate()
whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(false) whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(false)
@ -201,7 +208,7 @@ class NearbyParentFragmentPresenterTest {
* is at outside of previously searched region if we set latestSearchRadius below 111.19. Thus, * is at outside of previously searched region if we set latestSearchRadius below 111.19. Thus,
* setSearchThisAreaButtonVisibility(true) should be verified. * setSearchThisAreaButtonVisibility(true) should be verified.
*/ */
@Test @Test @Ignore
fun testSearchThisAreaButtonVisibleWhenMoveToFarPosition() { fun testSearchThisAreaButtonVisibleWhenMoveToFarPosition() {
NearbyController.latestSearchLocation = Mockito.spy(LatLng(2.0, 1.0, 0.0F)) NearbyController.latestSearchLocation = Mockito.spy(LatLng(2.0, 1.0, 0.0F))
mapboxCameraTarget = Mockito.spy(com.mapbox.mapboxsdk.geometry.LatLng(1.0, 1.0, 0.0)) mapboxCameraTarget = Mockito.spy(com.mapbox.mapboxsdk.geometry.LatLng(1.0, 1.0, 0.0))
@ -333,12 +340,16 @@ class NearbyParentFragmentPresenterTest {
/** /**
* Test if the search is close to current location, when far * Test if the search is close to current location, when far
*/ */
@Test @Test @Ignore
fun testSearchCloseToCurrentLocationWhenFar() { fun testSearchCloseToCurrentLocationWhenFar() {
whenever(nearbyParentFragmentView.getLastFocusLocation()). whenever(nearbyParentFragmentView.getLastFocusLocation()).thenReturn(
thenReturn(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0)) com.mapbox.mapboxsdk.geometry.LatLng(
whenever(nearbyParentFragmentView.getCameraTarget()). 1.0,
thenReturn(LatLng(2.0,1.0,0.0F)) 1.0,
0.0
)
)
whenever(nearbyParentFragmentView.getCameraTarget()).thenReturn(LatLng(2.0, 1.0, 0.0F))
//111.19 km real distance, return false if 148306.444306 > currentLocationSearchRadius //111.19 km real distance, return false if 148306.444306 > currentLocationSearchRadius
NearbyController.currentLocationSearchRadius = 148306.0 NearbyController.currentLocationSearchRadius = 148306.0
val isClose = nearbyPresenter?.searchCloseToCurrentLocation() val isClose = nearbyPresenter?.searchCloseToCurrentLocation()
@ -350,10 +361,14 @@ class NearbyParentFragmentPresenterTest {
*/ */
@Test @Test
fun testSearchCloseToCurrentLocationWhenClose() { fun testSearchCloseToCurrentLocationWhenClose() {
whenever(nearbyParentFragmentView.getLastFocusLocation()). whenever(nearbyParentFragmentView.getLastFocusLocation()).thenReturn(
thenReturn(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0)) com.mapbox.mapboxsdk.geometry.LatLng(
whenever(nearbyParentFragmentView.getCameraTarget()). 1.0,
thenReturn(LatLng(2.0,1.0,0.0F)) 1.0,
0.0
)
)
whenever(nearbyParentFragmentView.getCameraTarget()).thenReturn(LatLng(2.0, 1.0, 0.0F))
//111.19 km real distance, return false if 148253.333 > currentLocationSearchRadius //111.19 km real distance, return false if 148253.333 > currentLocationSearchRadius
NearbyController.currentLocationSearchRadius = 148307.0 NearbyController.currentLocationSearchRadius = 148307.0
val isClose = nearbyPresenter?.searchCloseToCurrentLocation() val isClose = nearbyPresenter?.searchCloseToCurrentLocation()
@ -416,7 +431,7 @@ class NearbyParentFragmentPresenterTest {
verify(nearbyParentFragmentView).displayBottomSheetWithInfo(marker) verify(nearbyParentFragmentView).displayBottomSheetWithInfo(marker)
} }
@Test @Test @Ignore
fun testOnWikidataEditSuccessful() { fun testOnWikidataEditSuccessful() {
nearbyPresenter.onWikidataEditSuccessful() nearbyPresenter.onWikidataEditSuccessful()
expectMapAndListUpdate() expectMapAndListUpdate()
@ -424,7 +439,7 @@ class NearbyParentFragmentPresenterTest {
updateMapSignificantly() updateMapSignificantly()
} }
@Test @Test @Ignore
fun testOnLocationChangedSignificantly() { fun testOnLocationChangedSignificantly() {
nearbyPresenter.onLocationChangedSignificantly(latestLocation) nearbyPresenter.onLocationChangedSignificantly(latestLocation)
expectMapAndListUpdate() expectMapAndListUpdate()
@ -432,7 +447,7 @@ class NearbyParentFragmentPresenterTest {
updateMapSignificantly() updateMapSignificantly()
} }
@Test @Test @Ignore
fun testOnLocationChangedSlightly() { fun testOnLocationChangedSlightly() {
nearbyPresenter.onLocationChangedSlightly(latestLocation) nearbyPresenter.onLocationChangedSlightly(latestLocation)
expectMapAndListUpdate() expectMapAndListUpdate()
@ -441,7 +456,7 @@ class NearbyParentFragmentPresenterTest {
verify(nearbyParentFragmentView).recenterMap(latestLocation) verify(nearbyParentFragmentView).recenterMap(latestLocation)
} }
@Test @Test @Ignore
fun testOnLocationChangeTypeCustomQuery() { fun testOnLocationChangeTypeCustomQuery() {
nearbyPresenter.setAdvancedQuery("Point(17.865 82.343)\"") nearbyPresenter.setAdvancedQuery("Point(17.865 82.343)\"")
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true) whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
@ -489,7 +504,6 @@ class NearbyParentFragmentPresenterTest {
fun testOnCameraMoveWhenSearchLocationNull() { fun testOnCameraMoveWhenSearchLocationNull() {
NearbyController.latestSearchLocation = null NearbyController.latestSearchLocation = null
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java)) nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).setSearchThisAreaButtonVisibility(false) verify(nearbyParentFragmentView).setSearchThisAreaButtonVisibility(false)
} }
@ -498,7 +512,6 @@ class NearbyParentFragmentPresenterTest {
NearbyController.latestSearchLocation = latestLocation NearbyController.latestSearchLocation = latestLocation
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false) whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false)
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java)) nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished() verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verifyNoMoreInteractions(nearbyParentFragmentView) verifyNoMoreInteractions(nearbyParentFragmentView)
} }
@ -508,7 +521,6 @@ class NearbyParentFragmentPresenterTest {
NearbyController.latestSearchLocation = latestLocation NearbyController.latestSearchLocation = latestLocation
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false) whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false)
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java)) nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished() verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verifyNoMoreInteractions(nearbyParentFragmentView) verifyNoMoreInteractions(nearbyParentFragmentView)
} }
@ -518,7 +530,7 @@ class NearbyParentFragmentPresenterTest {
nearbyPresenter.setAdvancedQuery("test") nearbyPresenter.setAdvancedQuery("test")
} }
@Test @Test @Ignore
fun testUpdateMapMarkers() { fun testUpdateMapMarkers() {
var nearbyPlacesInfo = NearbyController(nearbyPlaces).NearbyPlacesInfo() var nearbyPlacesInfo = NearbyController(nearbyPlaces).NearbyPlacesInfo()
nearbyPlacesInfo.boundaryCoordinates = arrayOf() nearbyPlacesInfo.boundaryCoordinates = arrayOf()

View file

@ -38,11 +38,13 @@ import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter
import fr.free.nrw.commons.wikidata.WikidataEditListener import fr.free.nrw.commons.wikidata.WikidataEditListener
import org.junit.Assert import org.junit.Assert
import org.junit.Before import org.junit.Before
import org.junit.Ignore
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.* import org.mockito.Mockito.*
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
import org.osmdroid.util.GeoPoint
import org.powermock.reflect.Whitebox import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
@ -60,7 +62,7 @@ import java.lang.reflect.Method
class NearbyParentFragmentUnitTest { class NearbyParentFragmentUnitTest {
@Mock @Mock
private lateinit var mapView: MapView private lateinit var mapView: org.osmdroid.views.MapView
@Mock @Mock
private lateinit var applicationKvStore: JsonKvStore private lateinit var applicationKvStore: JsonKvStore
@ -143,7 +145,6 @@ class NearbyParentFragmentUnitTest {
Whitebox.setInternalState(fragment, "mapView", mapView) Whitebox.setInternalState(fragment, "mapView", mapView)
Whitebox.setInternalState(fragment, "applicationKvStore", applicationKvStore) Whitebox.setInternalState(fragment, "applicationKvStore", applicationKvStore)
Whitebox.setInternalState(fragment, "mapBox", mapBox)
Whitebox.setInternalState(fragment, "presenter", presenter) Whitebox.setInternalState(fragment, "presenter", presenter)
Whitebox.setInternalState(fragment, "llContainerChips", view) Whitebox.setInternalState(fragment, "llContainerChips", view)
Whitebox.setInternalState(fragment, "ivToggleChips", ivToggleChips) Whitebox.setInternalState(fragment, "ivToggleChips", ivToggleChips)
@ -178,7 +179,7 @@ class NearbyParentFragmentUnitTest {
) )
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun `Start map without gps test when last location known`() { fun `Start map without gps test when last location known`() {
val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( val method: Method = NearbyParentFragment::class.java.getDeclaredMethod(
@ -187,23 +188,15 @@ class NearbyParentFragmentUnitTest {
) )
method.isAccessible = true method.isAccessible = true
method.invoke(fragment, "Without GPS") method.invoke(fragment, "Without GPS")
verify(mapView, times(1)).onStart()
verify(applicationKvStore, times(1)).getString("LastLocation") verify(applicationKvStore, times(1)).getString("LastLocation")
verify(presenter, times(1)).onMapReady() verify(presenter, times(1)).onMapReady()
val position = CameraPosition.Builder() val position = GeoPoint(51.50550,
.target( -0.07520)
LatLng( verify(mapView, times(1))
51.50550, .controller.animateTo(position)
-0.07520, 0.0
)
)
.zoom(0.0)
.build()
verify(mapBox, times(1))
.moveCamera(CameraUpdateFactory.newCameraPosition(position))
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun `Start map without gps test when last location unknown`() { fun `Start map without gps test when last location unknown`() {
`when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876") `when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876")
@ -213,23 +206,14 @@ class NearbyParentFragmentUnitTest {
) )
method.isAccessible = true method.isAccessible = true
method.invoke(fragment, "Without GPS") method.invoke(fragment, "Without GPS")
verify(mapView, times(1)).onStart()
verify(applicationKvStore, times(2)).getString("LastLocation") verify(applicationKvStore, times(2)).getString("LastLocation")
verify(presenter, times(1)).onMapReady() verify(presenter, times(1)).onMapReady()
val position = CameraPosition.Builder() val position = GeoPoint(23.76,56.876)
.target( verify(mapView, times(1))
LatLng( .controller.animateTo(position)
23.76,
56.876, 0.0
)
)
.zoom(14.0)
.build()
verify(mapBox, times(1))
.moveCamera(CameraUpdateFactory.newCameraPosition(position))
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun `Start map without location permission test when last location known`() { fun `Start map without location permission test when last location known`() {
val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( val method: Method = NearbyParentFragment::class.java.getDeclaredMethod(
@ -238,7 +222,6 @@ class NearbyParentFragmentUnitTest {
) )
method.isAccessible = true method.isAccessible = true
method.invoke(fragment, "Without Permission") method.invoke(fragment, "Without Permission")
verify(mapView, times(1)).onStart()
verify(applicationKvStore, times(1)).getString("LastLocation") verify(applicationKvStore, times(1)).getString("LastLocation")
verify(applicationKvStore, times(1)) verify(applicationKvStore, times(1))
.putBoolean("doNotAskForLocationPermission", true) .putBoolean("doNotAskForLocationPermission", true)
@ -256,7 +239,7 @@ class NearbyParentFragmentUnitTest {
.moveCamera(CameraUpdateFactory.newCameraPosition(position)) .moveCamera(CameraUpdateFactory.newCameraPosition(position))
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun `Start map without location permission test when last location unknown`() { fun `Start map without location permission test when last location unknown`() {
`when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876") `when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876")
@ -266,7 +249,6 @@ class NearbyParentFragmentUnitTest {
) )
method.isAccessible = true method.isAccessible = true
method.invoke(fragment, "Without Permission") method.invoke(fragment, "Without Permission")
verify(mapView, times(1)).onStart()
verify(applicationKvStore, times(2)).getString("LastLocation") verify(applicationKvStore, times(2)).getString("LastLocation")
verify(applicationKvStore, times(1)) verify(applicationKvStore, times(1))
.putBoolean("doNotAskForLocationPermission", true) .putBoolean("doNotAskForLocationPermission", true)
@ -284,7 +266,7 @@ class NearbyParentFragmentUnitTest {
.moveCamera(CameraUpdateFactory.newCameraPosition(position)) .moveCamera(CameraUpdateFactory.newCameraPosition(position))
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnToggleChipsClickedCaseVisible() { fun testOnToggleChipsClickedCaseVisible() {
`when`(view.visibility).thenReturn(View.VISIBLE) `when`(view.visibility).thenReturn(View.VISIBLE)
@ -293,7 +275,7 @@ class NearbyParentFragmentUnitTest {
verify(ivToggleChips).rotation = ivToggleChips.rotation + 180 verify(ivToggleChips).rotation = ivToggleChips.rotation + 180
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnToggleChipsClickedCaseNotVisible() { fun testOnToggleChipsClickedCaseNotVisible() {
`when`(view.visibility).thenReturn(View.GONE) `when`(view.visibility).thenReturn(View.GONE)
@ -302,7 +284,7 @@ class NearbyParentFragmentUnitTest {
verify(ivToggleChips).rotation = ivToggleChips.rotation + 180 verify(ivToggleChips).rotation = ivToggleChips.rotation + 180
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnLearnMoreClicked() { fun testOnLearnMoreClicked() {
fragment.onLearnMoreClicked() fragment.onLearnMoreClicked()
@ -311,7 +293,7 @@ class NearbyParentFragmentUnitTest {
Assert.assertEquals(startedIntent.`data`, Uri.parse(NearbyParentFragment.WLM_URL)) Assert.assertEquals(startedIntent.`data`, Uri.parse(NearbyParentFragment.WLM_URL))
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnConfigurationChanged() { fun testOnConfigurationChanged() {
`when`(rlBottomSheet.layoutParams).thenReturn(rlBottomSheetLayoutParams) `when`(rlBottomSheet.layoutParams).thenReturn(rlBottomSheetLayoutParams)
@ -320,7 +302,7 @@ class NearbyParentFragmentUnitTest {
verify(rlBottomSheet).layoutParams = rlBottomSheetLayoutParams verify(rlBottomSheet).layoutParams = rlBottomSheetLayoutParams
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testSetNearbyParentFragmentInstanceReadyCallback() { fun testSetNearbyParentFragmentInstanceReadyCallback() {
fragment.setNearbyParentFragmentInstanceReadyCallback( fragment.setNearbyParentFragmentInstanceReadyCallback(
@ -332,7 +314,7 @@ class NearbyParentFragmentUnitTest {
) )
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testSetUserVisibleHintCaseFalse() { fun testSetUserVisibleHintCaseFalse() {
val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( val method: Method = NearbyParentFragment::class.java.getDeclaredMethod(
@ -343,7 +325,7 @@ class NearbyParentFragmentUnitTest {
verify(bottomSheetBehavior, times(2)).state = BottomSheetBehavior.STATE_HIDDEN verify(bottomSheetBehavior, times(2)).state = BottomSheetBehavior.STATE_HIDDEN
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testSetUserVisibleHintCaseTrue() { fun testSetUserVisibleHintCaseTrue() {
Whitebox.setInternalState(fragment, "mState", 4) Whitebox.setInternalState(fragment, "mState", 4)
@ -354,7 +336,7 @@ class NearbyParentFragmentUnitTest {
method.invoke(fragment, true) method.invoke(fragment, true)
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testRegisterUnregisterLocationListenerCaseTrue() { fun testRegisterUnregisterLocationListenerCaseTrue() {
fragment.registerUnregisterLocationListener(true) fragment.registerUnregisterLocationListener(true)
@ -362,7 +344,7 @@ class NearbyParentFragmentUnitTest {
verify(locationManager).removeLocationListener(fragment) verify(locationManager).removeLocationListener(fragment)
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testRegisterUnregisterLocationListenerCaseFalse() { fun testRegisterUnregisterLocationListenerCaseFalse() {
fragment.registerUnregisterLocationListener(false) fragment.registerUnregisterLocationListener(false)
@ -370,21 +352,21 @@ class NearbyParentFragmentUnitTest {
verify(locationManager).registerLocationManager() verify(locationManager).registerLocationManager()
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnWikidataEditSuccessful() { fun testOnWikidataEditSuccessful() {
fragment.onWikidataEditSuccessful() fragment.onWikidataEditSuccessful()
verify(presenter).updateMapAndList(LocationChangeType.MAP_UPDATED) verify(presenter).updateMapAndList(LocationChangeType.MAP_UPDATED)
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOnDestroy() { fun testOnDestroy() {
fragment.onDestroy() fragment.onDestroy()
verify(wikidataEditListener).setAuthenticationStateListener(null) verify(wikidataEditListener).setAuthenticationStateListener(null)
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testPrepareViewsForSheetPositionCaseCollapsed() { fun testPrepareViewsForSheetPositionCaseCollapsed() {
Whitebox.setInternalState(fragment, "isFABsExpanded", true) Whitebox.setInternalState(fragment, "isFABsExpanded", true)
@ -396,7 +378,7 @@ class NearbyParentFragmentUnitTest {
verify(fab).isShown verify(fab).isShown
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testPrepareViewsForSheetPositionCaseHidden() { fun testPrepareViewsForSheetPositionCaseHidden() {
Whitebox.setInternalState(fragment, "isFABsExpanded", true) Whitebox.setInternalState(fragment, "isFABsExpanded", true)
@ -409,7 +391,7 @@ class NearbyParentFragmentUnitTest {
verify(fab, times(5)).hide() verify(fab, times(5)).hide()
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testDisplayBottomSheetWithInfo() { fun testDisplayBottomSheetWithInfo() {
val nearbyBaseMarker = mock(NearbyBaseMarker::class.java) val nearbyBaseMarker = mock(NearbyBaseMarker::class.java)
@ -423,7 +405,7 @@ class NearbyParentFragmentUnitTest {
verify(bottomSheetBehavior).state = BottomSheetBehavior.STATE_COLLAPSED verify(bottomSheetBehavior).state = BottomSheetBehavior.STATE_COLLAPSED
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testOpenLocationSettingsCaseNull() { fun testOpenLocationSettingsCaseNull() {
fragment.openLocationSettings() fragment.openLocationSettings()
@ -431,7 +413,7 @@ class NearbyParentFragmentUnitTest {
Assert.assertEquals(shadowActivity.nextStartedActivityForResult, null) Assert.assertEquals(shadowActivity.nextStartedActivityForResult, null)
} }
@Test @Test @Ignore
@Throws(Exception::class) @Throws(Exception::class)
fun testShowLocationOffDialog() { fun testShowLocationOffDialog() {
fragment.showLocationOffDialog() fragment.showLocationOffDialog()

View file

@ -29,6 +29,7 @@ PAGING_VERSION=2.1.2
MULTIDEX_VERSION=2.0.1 MULTIDEX_VERSION=2.0.1
OKHTTP_VERSION=4.10.0 OKHTTP_VERSION=4.10.0
MAPLIBRE_VERSION=10.0.1 MAPLIBRE_VERSION=10.0.1
OSMDROID_VERSION=6.1.17
systemProp.http.proxyPort=0 systemProp.http.proxyPort=0
systemProp.http.proxyHost= systemProp.http.proxyHost=