mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
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:
parent
755b216507
commit
863477aa02
5 changed files with 129 additions and 7 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue