diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index c140e024b9..e1a5aa1064 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -485,32 +485,52 @@ public void onResume() { registerNetworkReceiver(); if (isResumed() && ((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY) { if(!isPermissionDenied && !applicationKvStore.getBoolean("doNotAskForLocationPermission", false)){ - startTheMap(); + if (!locationManager.isGPSProviderEnabled()) { + startMapWithCondition("Without GPS"); + } else { + startTheMap(); + } }else{ - startMapWithoutPermission(); + startMapWithCondition("Without Permission"); } } } - private void startMapWithoutPermission() { + /** + * Starts the map without GPS and without permission + * By default it points to 51.50550,-0.07520 coordinates, other than that it points to the + * last known location which can be get by the key "LastLocation" from applicationKvStore + * + * @param condition : for which condition the map should start + */ + private void startMapWithCondition(final String condition) { mapView.onStart(); - applicationKvStore.putBoolean("doNotAskForLocationPermission", true); + if (condition.equals("Without Permission")) { + applicationKvStore.putBoolean("doNotAskForLocationPermission", true); + } + final CameraPosition position; - if(applicationKvStore.getString("LastLocation")!=null) { // Checking for last searched location - String[] locationLatLng = applicationKvStore.getString("LastLocation").split(","); - lastKnownLocation = new fr.free.nrw.commons.location.LatLng(Double.valueOf(locationLatLng[0]), Double.valueOf(locationLatLng[1]), 1f); + if (applicationKvStore.getString("LastLocation")!=null) { + final String[] locationLatLng + = applicationKvStore.getString("LastLocation").split(","); + lastKnownLocation + = new fr.free.nrw.commons.location.LatLng(Double.parseDouble(locationLatLng[0]), + Double.parseDouble(locationLatLng[1]), 1f); position = new CameraPosition.Builder() .target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation)) .zoom(ZOOM_LEVEL) .build(); - }else { - lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550,-0.07520,1f); + + } else { + lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550, + -0.07520,1f); position = new CameraPosition.Builder() .target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation)) .zoom(ZOOM_OUT) .build(); } + if(mapBox != null){ mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position)); addOnCameraMoveListener(); @@ -1368,7 +1388,7 @@ public void enableFABRecenter() { */ @Override public void addCurrentLocationMarker(final fr.free.nrw.commons.location.LatLng curLatLng) { - if (null != curLatLng && !isPermissionDenied) { + if (null != curLatLng && !isPermissionDenied && locationManager.isGPSProviderEnabled()) { ExecutorUtils.get().submit(() -> { mapView.post(() -> removeCurrentLocationMarker()); Timber.d("Adds current location marker"); diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyParentFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyParentFragmentUnitTest.kt new file mode 100644 index 0000000000..9f2e8b61d9 --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyParentFragmentUnitTest.kt @@ -0,0 +1,150 @@ +package fr.free.nrw.commons.nearby + +import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.maps.MapView +import com.mapbox.mapboxsdk.maps.MapboxMap +import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.kvstore.JsonKvStore +import fr.free.nrw.commons.nearby.fragments.NearbyParentFragment +import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.* +import org.mockito.MockitoAnnotations +import org.powermock.reflect.Whitebox +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.robolectric.annotation.LooperMode +import java.lang.reflect.Method + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [21], application = TestCommonsApplication::class) +@LooperMode(LooperMode.Mode.PAUSED) +class NearbyParentFragmentUnitTest { + + @Mock + private lateinit var mapView: MapView + + @Mock + private lateinit var applicationKvStore: JsonKvStore + + @Mock + private lateinit var mapBox: MapboxMap + + @Mock + private lateinit var presenter: NearbyParentFragmentPresenter + + private lateinit var fragment: NearbyParentFragment + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + fragment = NearbyParentFragment() + Whitebox.setInternalState(fragment, "mapView", mapView) + Whitebox.setInternalState(fragment, "applicationKvStore", applicationKvStore) + Whitebox.setInternalState(fragment, "mapBox", mapBox) + Whitebox.setInternalState(fragment, "presenter", presenter) + } + + @Test + @Throws(Exception::class) + fun `Start map without gps test when last location known`() { + val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( + "startMapWithCondition", + String::class.java + ) + method.isAccessible = true + method.invoke(fragment, "Without GPS") + verify(mapView, times(1)).onStart() + verify(applicationKvStore, times(1)).getString("LastLocation") + verify(presenter, times(1)).onMapReady() + val position = CameraPosition.Builder() + .target(LatLng( + 51.50550, + -0.07520, 0.0 + )) + .zoom(0.0) + .build() + verify(mapBox, times(1)) + .moveCamera(CameraUpdateFactory.newCameraPosition(position)) + } + + @Test + @Throws(Exception::class) + fun `Start map without gps test when last location unknown`() { + `when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876") + val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( + "startMapWithCondition", + String::class.java + ) + method.isAccessible = true + method.invoke(fragment, "Without GPS") + verify(mapView, times(1)).onStart() + verify(applicationKvStore, times(2)).getString("LastLocation") + verify(presenter, times(1)).onMapReady() + val position = CameraPosition.Builder() + .target(LatLng( + 23.76, + 56.876, 0.0 + )) + .zoom(14.0) + .build() + verify(mapBox, times(1)) + .moveCamera(CameraUpdateFactory.newCameraPosition(position)) + } + + @Test + @Throws(Exception::class) + fun `Start map without location permission test when last location known`() { + val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( + "startMapWithCondition", + String::class.java + ) + method.isAccessible = true + method.invoke(fragment, "Without Permission") + verify(mapView, times(1)).onStart() + verify(applicationKvStore, times(1)).getString("LastLocation") + verify(applicationKvStore, times(1)) + .putBoolean("doNotAskForLocationPermission", true) + verify(presenter, times(1)).onMapReady() + val position = CameraPosition.Builder() + .target(LatLng( + 51.50550, + -0.07520, 0.0 + )) + .zoom(0.0) + .build() + verify(mapBox, times(1)) + .moveCamera(CameraUpdateFactory.newCameraPosition(position)) + } + + @Test + @Throws(Exception::class) + fun `Start map without location permission test when last location unknown`() { + `when`(applicationKvStore.getString("LastLocation")).thenReturn("23.76,56.876") + val method: Method = NearbyParentFragment::class.java.getDeclaredMethod( + "startMapWithCondition", + String::class.java + ) + method.isAccessible = true + method.invoke(fragment, "Without Permission") + verify(mapView, times(1)).onStart() + verify(applicationKvStore, times(2)).getString("LastLocation") + verify(applicationKvStore, times(1)) + .putBoolean("doNotAskForLocationPermission", true) + verify(presenter, times(1)).onMapReady() + val position = CameraPosition.Builder() + .target(LatLng( + 23.76, + 56.876, 0.0 + )) + .zoom(14.0) + .build() + verify(mapBox, times(1)) + .moveCamera(CameraUpdateFactory.newCameraPosition(position)) + } +} \ No newline at end of file