Nearby tab accessible without GPS (#4771)

* Nearby accessible without GPS

* Java doc added

* Added NearbyParentFragment test

* Test added

* merged two method and tests updates
This commit is contained in:
Ayan Sarkar 2022-02-05 21:16:08 +05:30 committed by GitHub
parent e135fea20d
commit 0e4755301e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 180 additions and 10 deletions

View file

@ -485,32 +485,52 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
registerNetworkReceiver(); registerNetworkReceiver();
if (isResumed() && ((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY) { if (isResumed() && ((MainActivity)getActivity()).activeFragment == ActiveFragment.NEARBY) {
if(!isPermissionDenied && !applicationKvStore.getBoolean("doNotAskForLocationPermission", false)){ if(!isPermissionDenied && !applicationKvStore.getBoolean("doNotAskForLocationPermission", false)){
startTheMap(); if (!locationManager.isGPSProviderEnabled()) {
startMapWithCondition("Without GPS");
} else { } else {
startMapWithoutPermission(); startTheMap();
}
}else{
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(); mapView.onStart();
if (condition.equals("Without Permission")) {
applicationKvStore.putBoolean("doNotAskForLocationPermission", true); applicationKvStore.putBoolean("doNotAskForLocationPermission", true);
}
final CameraPosition position; final CameraPosition position;
if(applicationKvStore.getString("LastLocation")!=null) { // Checking for last searched location if (applicationKvStore.getString("LastLocation")!=null) {
String[] locationLatLng = applicationKvStore.getString("LastLocation").split(","); final String[] locationLatLng
lastKnownLocation = new fr.free.nrw.commons.location.LatLng(Double.valueOf(locationLatLng[0]), Double.valueOf(locationLatLng[1]), 1f); = 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() position = new CameraPosition.Builder()
.target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation)) .target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation))
.zoom(ZOOM_LEVEL) .zoom(ZOOM_LEVEL)
.build(); .build();
} else { } else {
lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550,-0.07520,1f); lastKnownLocation = new fr.free.nrw.commons.location.LatLng(51.50550,
-0.07520,1f);
position = new CameraPosition.Builder() position = new CameraPosition.Builder()
.target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation)) .target(LocationUtils.commonsLatLngToMapBoxLatLng(lastKnownLocation))
.zoom(ZOOM_OUT) .zoom(ZOOM_OUT)
.build(); .build();
} }
if(mapBox != null){ if(mapBox != null){
mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position)); mapBox.moveCamera(CameraUpdateFactory.newCameraPosition(position));
addOnCameraMoveListener(); addOnCameraMoveListener();
@ -1368,7 +1388,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
*/ */
@Override @Override
public void addCurrentLocationMarker(final fr.free.nrw.commons.location.LatLng curLatLng) { public void addCurrentLocationMarker(final fr.free.nrw.commons.location.LatLng curLatLng) {
if (null != curLatLng && !isPermissionDenied) { if (null != curLatLng && !isPermissionDenied && locationManager.isGPSProviderEnabled()) {
ExecutorUtils.get().submit(() -> { ExecutorUtils.get().submit(() -> {
mapView.post(() -> removeCurrentLocationMarker()); mapView.post(() -> removeCurrentLocationMarker());
Timber.d("Adds current location marker"); Timber.d("Adds current location marker");

View file

@ -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))
}
}