Fixed 4794 : Added a functionality of remembering zoom level on map (#4817)

* Fixed 4794 : Added a functionality of remembering zoom level on map

* Added Required Changes

* Added Required Changes

* Added Required Changes

* Added Required Changes

* Added Required Tests for the RememberZoomLevel
This commit is contained in:
Arin Modi 2022-02-17 12:22:48 +05:30 committed by GitHub
parent 755b216507
commit 863477aa02
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 129 additions and 7 deletions

View file

@ -7,6 +7,7 @@ import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconIgnorePlacem
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.visibility; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.visibility;
import static fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION; import static fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION;
import static fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM;
import android.content.Intent; import android.content.Intent;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
@ -382,6 +383,7 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa
mapboxMap.getCameraPosition().target.getLatitude() mapboxMap.getCameraPosition().target.getLatitude()
+ "," + ","
+ mapboxMap.getCameraPosition().target.getLongitude()); + mapboxMap.getCameraPosition().target.getLongitude());
applicationKvStore.putString(LAST_ZOOM, mapboxMap.getCameraPosition().zoom + "");
} }
final Intent returningIntent = new Intent(); final Intent returningIntent = new Intent();
returningIntent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION, returningIntent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION,

View file

@ -18,6 +18,10 @@ class ImageCoordinates internal constructor(exif: ExifInterface?) {
* @return string of `"[decLatitude]|[decLongitude]"` or null if coordinates do not exist * @return string of `"[decLatitude]|[decLongitude]"` or null if coordinates do not exist
*/ */
var decimalCoords: String? = null var decimalCoords: String? = null
var zoomLevel : Double = 16.0
/**
* @return double value of zoom or 16.0 by default
*/
/** /**
* Construct from a stream. * Construct from a stream.

View file

@ -60,6 +60,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
* from applicationKvStore. * from applicationKvStore.
*/ */
public static final String LAST_LOCATION = "last_location_while_uploading"; public static final String LAST_LOCATION = "last_location_while_uploading";
public static final String LAST_ZOOM = "last_zoom_level_while_uploading";
@BindView(R.id.tv_title) @BindView(R.id.tv_title)
TextView tvTitle; TextView tvTitle;
@BindView(R.id.ib_map) @BindView(R.id.ib_map)
@ -424,17 +425,19 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
editableUploadItem = uploadItem; editableUploadItem = uploadItem;
double defaultLatitude = 37.773972; double defaultLatitude = 37.773972;
double defaultLongitude = -122.431297; double defaultLongitude = -122.431297;
double defaultZoom = 16.0;
if (uploadItem.getGpsCoords() if (uploadItem.getGpsCoords() != null && uploadItem.getGpsCoords()
.getDecLatitude() != 0.0 && uploadItem.getGpsCoords().getDecLongitude() != 0.0) { .getDecLatitude() != 0.0 && uploadItem.getGpsCoords().getDecLongitude() != 0.0) {
defaultLatitude = uploadItem.getGpsCoords() defaultLatitude = uploadItem.getGpsCoords()
.getDecLatitude(); .getDecLatitude();
defaultLongitude = uploadItem.getGpsCoords().getDecLongitude(); defaultLongitude = uploadItem.getGpsCoords().getDecLongitude();
defaultZoom = uploadItem.getGpsCoords().getZoomLevel();
startActivityForResult(new LocationPicker.IntentBuilder() startActivityForResult(new LocationPicker.IntentBuilder()
.defaultLocation(new CameraPosition.Builder() .defaultLocation(new CameraPosition.Builder()
.target( .target(
new com.mapbox.mapboxsdk.geometry.LatLng(defaultLatitude, defaultLongitude)) new com.mapbox.mapboxsdk.geometry.LatLng(defaultLatitude, defaultLongitude))
.zoom(16).build()) .zoom(defaultZoom).build())
.activityKey("UploadActivity") .activityKey("UploadActivity")
.build(getActivity()), REQUEST_CODE); .build(getActivity()), REQUEST_CODE);
} else { } else {
@ -444,11 +447,14 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
defaultLatitude = Double.parseDouble(locationLatLng[0]); defaultLatitude = Double.parseDouble(locationLatLng[0]);
defaultLongitude = Double.parseDouble(locationLatLng[1]); defaultLongitude = Double.parseDouble(locationLatLng[1]);
} }
if(defaultKvStore.getString(LAST_ZOOM) != null){
defaultZoom = Double.parseDouble(defaultKvStore.getString(LAST_ZOOM));
}
startActivityForResult(new LocationPicker.IntentBuilder() startActivityForResult(new LocationPicker.IntentBuilder()
.defaultLocation(new CameraPosition.Builder() .defaultLocation(new CameraPosition.Builder()
.target( .target(
new com.mapbox.mapboxsdk.geometry.LatLng(defaultLatitude, defaultLongitude)) new com.mapbox.mapboxsdk.geometry.LatLng(defaultLatitude, defaultLongitude))
.zoom(16).build()) .zoom(defaultZoom).build())
.activityKey("NoLocationUploadActivity") .activityKey("NoLocationUploadActivity")
.build(getActivity()), REQUEST_CODE); .build(getActivity()), REQUEST_CODE);
} }
@ -474,8 +480,9 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
final String latitude = String.valueOf(cameraPosition.target.getLatitude()); final String latitude = String.valueOf(cameraPosition.target.getLatitude());
final String longitude = String.valueOf(cameraPosition.target.getLongitude()); final String longitude = String.valueOf(cameraPosition.target.getLongitude());
final double zoom = cameraPosition.zoom;
editLocation(latitude, longitude); editLocation(latitude, longitude,zoom);
} }
} }
} }
@ -485,12 +492,13 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
* @param latitude new latitude * @param latitude new latitude
* @param longitude new longitude * @param longitude new longitude
*/ */
public void editLocation(final String latitude, final String longitude){ public void editLocation(final String latitude, final String longitude, final double zoom){
editableUploadItem.getGpsCoords().setDecLatitude(Double.parseDouble(latitude)); editableUploadItem.getGpsCoords().setDecLatitude(Double.parseDouble(latitude));
editableUploadItem.getGpsCoords().setDecLongitude(Double.parseDouble(longitude)); editableUploadItem.getGpsCoords().setDecLongitude(Double.parseDouble(longitude));
editableUploadItem.getGpsCoords().setDecimalCoords(latitude+"|"+longitude); editableUploadItem.getGpsCoords().setDecimalCoords(latitude+"|"+longitude);
editableUploadItem.getGpsCoords().setImageCoordsExists(true); editableUploadItem.getGpsCoords().setImageCoordsExists(true);
editableUploadItem.getGpsCoords().setZoomLevel(zoom);
Toast.makeText(getContext(), "Location Updated", Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), "Location Updated", Toast.LENGTH_LONG).show();
} }

View file

@ -0,0 +1,67 @@
package fr.free.nrw.commons.locationpicker
import android.os.Looper
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapboxMap
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
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 LocationPickerActivityTest {
private lateinit var activityLocationPicker : LocationPickerActivity
@Mock
private lateinit var applicationKvStore: JsonKvStore
@Mock
private lateinit var mapboxMap : MapboxMap
@Before
fun setup(){
MockitoAnnotations.initMocks(this)
activityLocationPicker = Robolectric.buildActivity(LocationPickerActivity::class.java).get()
}
@Test
@Throws(Exception::class)
fun testRememberZoomLevel(){
shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(activityLocationPicker,"mapboxMap",mapboxMap)
Whitebox.setInternalState(activityLocationPicker,"activity", "NoLocationUploadActivity")
Whitebox.setInternalState(activityLocationPicker,"applicationKvStore",applicationKvStore)
val position = CameraPosition.Builder().target(LatLng(
51.50550,
-0.07520, 0.0
)
).zoom(15.0).build()
`when`(mapboxMap.cameraPosition).thenReturn(position)
val method: Method = LocationPickerActivity::class.java.getDeclaredMethod(
"placeSelected"
)
method.isAccessible = true
method.invoke(activityLocationPicker)
Mockito.verify(applicationKvStore,Mockito.times(1))
.putString(LAST_ZOOM,position.zoom.toString())
}
}

View file

@ -21,6 +21,7 @@ import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng import com.mapbox.mapboxsdk.geometry.LatLng
import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.mock
import fr.free.nrw.commons.LocationPicker.LocationPicker import fr.free.nrw.commons.LocationPicker.LocationPicker
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestAppAdapter import fr.free.nrw.commons.TestAppAdapter
import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.TestCommonsApplication
@ -30,6 +31,7 @@ import fr.free.nrw.commons.upload.ImageCoordinates
import fr.free.nrw.commons.upload.UploadActivity import fr.free.nrw.commons.upload.UploadActivity
import fr.free.nrw.commons.upload.UploadItem import fr.free.nrw.commons.upload.UploadItem
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import org.junit.Assert import org.junit.Assert
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -43,8 +45,11 @@ import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment import org.robolectric.RuntimeEnvironment
import org.robolectric.Shadows import org.robolectric.Shadows
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode import org.robolectric.annotation.LooperMode
import org.robolectric.shadows.ShadowActivity
import org.robolectric.shadows.ShadowIntent
import org.wikipedia.AppAdapter import org.wikipedia.AppAdapter
import java.lang.reflect.Method import java.lang.reflect.Method
@ -98,6 +103,8 @@ class UploadMediaDetailFragmentUnitTest {
@Mock @Mock
private lateinit var imageCoordinates: ImageCoordinates private lateinit var imageCoordinates: ImageCoordinates
private lateinit var activity: UploadActivity
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
@ -105,7 +112,7 @@ class UploadMediaDetailFragmentUnitTest {
context = RuntimeEnvironment.application.applicationContext context = RuntimeEnvironment.application.applicationContext
AppAdapter.set(TestAppAdapter()) AppAdapter.set(TestAppAdapter())
val activity = Robolectric.buildActivity(UploadActivity::class.java).create().get() activity = Robolectric.buildActivity(UploadActivity::class.java).create().get()
layoutInflater = LayoutInflater.from(activity) layoutInflater = LayoutInflater.from(activity)
view = LayoutInflater.from(activity) view = LayoutInflater.from(activity)
@ -342,10 +349,11 @@ class UploadMediaDetailFragmentUnitTest {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testShowExternalMap() { fun testShowExternalMap() {
Shadows.shadowOf(Looper.getMainLooper()).idle() shadowOf(Looper.getMainLooper()).idle()
`when`(uploadItem.gpsCoords).thenReturn(imageCoordinates) `when`(uploadItem.gpsCoords).thenReturn(imageCoordinates)
`when`(imageCoordinates.decLatitude).thenReturn(0.0) `when`(imageCoordinates.decLatitude).thenReturn(0.0)
`when`(imageCoordinates.decLongitude).thenReturn(0.0) `when`(imageCoordinates.decLongitude).thenReturn(0.0)
`when`(imageCoordinates.zoomLevel).thenReturn(16.0)
fragment.showExternalMap(uploadItem) fragment.showExternalMap(uploadItem)
} }
@ -431,4 +439,37 @@ class UploadMediaDetailFragmentUnitTest {
fragment.displayAddLocationDialog(runnable) fragment.displayAddLocationDialog(runnable)
} }
@Test
@Throws(Exception::class)
fun testRememberedZoomLevelOnNull(){
shadowOf(Looper.getMainLooper()).idle()
Whitebox.setInternalState(fragment, "defaultKvStore", defaultKvStore)
`when`(uploadItem.gpsCoords).thenReturn(null)
`when`(defaultKvStore.getString(LAST_ZOOM)).thenReturn("13.0")
fragment.showExternalMap(uploadItem)
Mockito.verify(uploadItem,Mockito.times(1)).gpsCoords
Mockito.verify(defaultKvStore,Mockito.times(2)).getString(LAST_ZOOM)
val shadowActivity: ShadowActivity = shadowOf(activity)
val startedIntent = shadowActivity.nextStartedActivity
val shadowIntent: ShadowIntent = shadowOf(startedIntent)
Assert.assertEquals(shadowIntent.intentClass, LocationPickerActivity::class.java)
}
@Test
@Throws(Exception::class)
fun testRememberedZoomLevelOnNotNull(){
shadowOf(Looper.getMainLooper()).idle()
`when`(uploadItem.gpsCoords).thenReturn(imageCoordinates)
`when`(imageCoordinates.decLatitude).thenReturn(8.0)
`when`(imageCoordinates.decLongitude).thenReturn(-8.0)
`when`(imageCoordinates.zoomLevel).thenReturn(14.0)
`when`(defaultKvStore.getString(LAST_ZOOM)).thenReturn(null)
fragment.showExternalMap(uploadItem)
Mockito.verify(uploadItem.gpsCoords,Mockito.times(1)).zoomLevel
val shadowActivity: ShadowActivity = shadowOf(activity)
val startedIntent = shadowActivity.nextStartedActivity
val shadowIntent: ShadowIntent = shadowOf(startedIntent)
Assert.assertEquals(shadowIntent.intentClass, LocationPickerActivity::class.java)
}
} }