Skip to content

Commit 61823dc

Browse files
authoredJul 22, 2020
Merge pull request #339 from onaio/edit-foci-boundary-enhancements
Edit foci boundary enhancements
2 parents d4d76cb + c017036 commit 61823dc

File tree

7 files changed

+136
-4
lines changed

7 files changed

+136
-4
lines changed
 

‎library/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ apply plugin: 'realm-android'
2121
apply plugin: 'com.jfrog.bintray'
2222
apply plugin: 'maven-publish'
2323

24-
version '0.8.7'
24+
version '0.8.8'
2525

2626
project.version = this.version
2727

‎library/src/main/java/io/ona/kujaku/interfaces/IKujakuMapView.java

+20
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.ona.kujaku.listeners.BoundsChangeListener;
2828
import io.ona.kujaku.listeners.LocationClientStartedCallback;
2929
import io.ona.kujaku.listeners.OnFeatureClickListener;
30+
import io.ona.kujaku.listeners.OnFeatureLongClickListener;
3031
import io.ona.kujaku.listeners.TrackingServiceListener;
3132
import io.ona.kujaku.location.KujakuLocation;
3233
import io.ona.kujaku.services.configurations.TrackingServiceUIConfiguration;
@@ -188,6 +189,25 @@ public interface IKujakuMapView extends IKujakuMapViewLowLevel {
188189
*/
189190
void setOnFeatureClickListener(@NonNull OnFeatureClickListener onFeatureClickListener, @Nullable Expression expressionFilter, @Nullable String... layerIds);
190191

192+
/**
193+
* Sets an {@link OnFeatureLongClickListener} which will be fired when a feature on the map in either of the {@code layerIds}
194+
* is long touched/clicked
195+
*
196+
* @param onFeatureLongClickListener
197+
* @param layerIds
198+
*/
199+
void setOnFeatureLongClickListener(@NonNull OnFeatureLongClickListener onFeatureLongClickListener, @Nullable String... layerIds);
200+
201+
/**
202+
* Sets an {@link OnFeatureLongClickListener} which will be fired when a feature on the map in either of the {@code layerIds}
203+
* is long touched/clicked and/or fulfilling the filter defined in {@code filter}
204+
*
205+
* @param onFeatureLongClickListener
206+
* @param expressionFilter
207+
* @param layerIds
208+
*/
209+
void setOnFeatureLongClickListener(@NonNull OnFeatureLongClickListener onFeatureLongClickListener, @Nullable Expression expressionFilter, @Nullable String... layerIds);
210+
191211
/**
192212
* Checks if the map warms GPS(this just means the location service that is going to be used).
193213
* Warming the GPS in this case means that it starts the location services as soon as you open
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.ona.kujaku.listeners;
2+
3+
import android.support.annotation.NonNull;
4+
5+
import com.mapbox.geojson.Feature;
6+
7+
import java.util.List;
8+
9+
/**
10+
* Created by Richard Kareko on 5/18/20.
11+
*/
12+
13+
public interface OnFeatureLongClickListener {
14+
15+
/**
16+
* Called when a features(s) is long clicked on the map and adheres to params passed in
17+
* {@link io.ona.kujaku.views.KujakuMapView#setOnFeatureLongClickListener(OnFeatureLongClickListener, String...)}
18+
* or {@link io.ona.kujaku.views.KujakuMapView#setOnFeatureLongClickListener(OnFeatureLongClickListener, com.mapbox.mapboxsdk.style.expressions.Expression, String...)}
19+
*
20+
* @param features
21+
*/
22+
void onFeatureLongClick(@NonNull List<Feature> features);
23+
}

‎library/src/main/java/io/ona/kujaku/manager/DrawingManager.java

+11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.mapbox.geojson.Feature;
99
import com.mapbox.geojson.FeatureCollection;
1010
import com.mapbox.geojson.Geometry;
11+
import com.mapbox.geojson.MultiPolygon;
1112
import com.mapbox.geojson.Point;
1213
import com.mapbox.geojson.Polygon;
1314
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -217,6 +218,16 @@ public boolean startDrawing(@Nullable FillBoundaryLayer fillBoundaryLayer) {
217218
List<Point> points = polygon.coordinates().get(0);
218219
this.startDrawingPoints(points);
219220
return true;
221+
} else if (geometry instanceof MultiPolygon) {
222+
// hide layer
223+
fillBoundaryLayer.disableLayerOnMap(mapboxMap);
224+
225+
MultiPolygon multiPolygon = (MultiPolygon) geometry;
226+
for (List<List<Point>> polygonCoordinates : multiPolygon.coordinates()) {
227+
List<Point> points = polygonCoordinates.get(0);
228+
this.startDrawingPoints(points);
229+
}
230+
return true;
220231
}
221232
}
222233

‎library/src/main/java/io/ona/kujaku/views/KujakuMapView.java

+26
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import io.ona.kujaku.listeners.BoundsChangeListener;
7676
import io.ona.kujaku.listeners.LocationClientStartedCallback;
7777
import io.ona.kujaku.listeners.OnFeatureClickListener;
78+
import io.ona.kujaku.listeners.OnFeatureLongClickListener;
7879
import io.ona.kujaku.listeners.OnKujakuLayerClickListener;
7980
import io.ona.kujaku.listeners.OnKujakuLayerLongClickListener;
8081
import io.ona.kujaku.listeners.OnLocationChanged;
@@ -165,9 +166,13 @@ public class KujakuMapView extends MapView implements IKujakuMapView, MapboxMap.
165166
private BoundsChangeListener boundsChangeListener;
166167

167168
private OnFeatureClickListener onFeatureClickListener;
169+
private OnFeatureLongClickListener onFeatureLongClickListener;
168170
private String[] featureClickLayerIdFilters;
169171
private Expression featureClickExpressionFilter;
170172

173+
private String[] featureLongClickLayerIdFilters;
174+
private Expression featureLongClickExpressionFilter;
175+
171176
private OnKujakuLayerClickListener onKujakuLayerClickListener;
172177
private OnKujakuLayerLongClickListener onKujakuLayerLongClickListener;
173178

@@ -830,6 +835,18 @@ public void setOnFeatureClickListener(@NonNull OnFeatureClickListener onFeatureC
830835
this.featureClickExpressionFilter = expressionFilter;
831836
}
832837

838+
@Override
839+
public void setOnFeatureLongClickListener(@NonNull OnFeatureLongClickListener onFeatureLongClickListener, @Nullable String... layerIds) {
840+
this.setOnFeatureLongClickListener(onFeatureLongClickListener, null, layerIds);
841+
}
842+
843+
@Override
844+
public void setOnFeatureLongClickListener(@NonNull OnFeatureLongClickListener onFeatureLongClickListener, @Nullable Expression expressionFilter, @Nullable String... layerIds) {
845+
this.onFeatureLongClickListener = onFeatureLongClickListener;
846+
this.featureLongClickLayerIdFilters = layerIds;
847+
this.featureLongClickExpressionFilter = expressionFilter;
848+
}
849+
833850
/**
834851
* Set listener when pressing a KujakuLayer
835852
*
@@ -1125,6 +1142,15 @@ public boolean onMapClick(@NonNull LatLng point) {
11251142
public boolean onMapLongClick(@NonNull LatLng point) {
11261143
PointF pixel = mapboxMap.getProjection().toScreenLocation(point);
11271144

1145+
if (onFeatureLongClickListener != null) {
1146+
List<com.mapbox.geojson.Feature> features = mapboxMap.queryRenderedFeatures(pixel, featureLongClickExpressionFilter, featureLongClickLayerIdFilters);
1147+
1148+
if (features.size() > 0) {
1149+
onFeatureLongClickListener.onFeatureLongClick(features);
1150+
}
1151+
}
1152+
1153+
11281154
if (onKujakuLayerLongClickListener != null) {
11291155
KujakuLayer layer = KujakuLayer.getKujakuLayerSelected(pixel, kujakuLayers, mapboxMap);
11301156
if (layer != null) {

‎library/src/test/java/io/ona/kujaku/manager/DrawingManagerTest.java

+41-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.mapbox.geojson.Feature;
44
import com.mapbox.geojson.FeatureCollection;
5+
import com.mapbox.geojson.MultiPolygon;
56
import com.mapbox.geojson.Point;
67
import com.mapbox.geojson.Polygon;
78
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -78,7 +79,26 @@ public void startDrawingWithPoints() {
7879

7980
@Test
8081
public void startDrawingWithExistingLayer() {
81-
manager.startDrawing(getFillBoundaryLayer());
82+
manager.startDrawing(getFillBoundaryLayer(true));
83+
84+
Assert.assertTrue(manager.isDrawingEnabled());
85+
Assert.assertNull(manager.getCurrentKujakuCircle());
86+
// Middle Circles created between each point
87+
Assert.assertEquals(8, manager.getKujakuCircles().size());
88+
89+
Assert.assertFalse(manager.getKujakuCircles().get(0).isMiddleCircle());
90+
Assert.assertTrue(manager.getKujakuCircles().get(1).isMiddleCircle());
91+
Assert.assertFalse(manager.getKujakuCircles().get(2).isMiddleCircle());
92+
Assert.assertTrue(manager.getKujakuCircles().get(3).isMiddleCircle());
93+
Assert.assertFalse(manager.getKujakuCircles().get(4).isMiddleCircle());
94+
Assert.assertTrue(manager.getKujakuCircles().get(5).isMiddleCircle());
95+
Assert.assertFalse(manager.getKujakuCircles().get(6).isMiddleCircle());
96+
Assert.assertTrue(manager.getKujakuCircles().get(7).isMiddleCircle());
97+
}
98+
99+
@Test
100+
public void startDrawingWithExistingMultipolygonLayer() {
101+
manager.startDrawing(getFillBoundaryLayer(false));
82102

83103
Assert.assertTrue(manager.isDrawingEnabled());
84104
Assert.assertNull(manager.getCurrentKujakuCircle());
@@ -206,18 +226,36 @@ public void areMiddleCircles() {
206226
Assert.assertTrue(manager.getKujakuCircles().get(7).isMiddleCircle());
207227
}
208228

209-
private FillBoundaryLayer getFillBoundaryLayer() {
229+
@Test
230+
public void unSetCurrentCircleDraggable() {
231+
manager.create(DrawingManager.getKujakuCircleOptions().withLatLng(new LatLng(1,1)));
232+
Circle circle = manager.getKujakuCircles().get(0).getCircle();
233+
manager.setDraggable(true, circle);
234+
235+
Assert.assertTrue(manager.getCurrentKujakuCircle().getCircle().isDraggable());
236+
manager.unsetCurrentCircleDraggable();
237+
Assert.assertNull(manager.getCurrentKujakuCircle());
238+
}
239+
240+
241+
private FillBoundaryLayer getFillBoundaryLayer(boolean isPolygon) {
210242
List<Feature> features = new ArrayList<Feature>();
211243
List<List<Point>> lists = new ArrayList<>();
212244
List<Point> points = new ArrayList<>();
245+
Polygon polygon = null;
213246

214247
points.add(Point.fromLngLat(-11,15));
215248
points.add(Point.fromLngLat(-5,15));
216249
points.add(Point.fromLngLat(-5,11));
217250
points.add(Point.fromLngLat(-11,11));
218251
lists.add(points);
219252

220-
features.add(Feature.fromGeometry(Polygon.fromLngLats(lists)));
253+
polygon = Polygon.fromLngLats(lists);
254+
if (!isPolygon) {
255+
features.add(Feature.fromGeometry(polygon));
256+
} else {
257+
features.add(Feature.fromGeometry(MultiPolygon.fromPolygon(polygon)));
258+
}
221259

222260
FeatureCollection featureCollection = FeatureCollection.fromFeatures(features);
223261
FillBoundaryLayer.Builder builder = new FillBoundaryLayer.Builder(featureCollection);

‎library/src/test/java/io/ona/kujaku/views/KujakuMapViewTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
import io.ona.kujaku.BaseTest;
2525
import io.ona.kujaku.interfaces.ILocationClient;
2626
import io.ona.kujaku.listeners.LocationClientStartedCallback;
27+
import io.ona.kujaku.listeners.OnFeatureLongClickListener;
2728
import io.ona.kujaku.location.clients.GoogleLocationClient;
2829
import io.ona.kujaku.test.shadows.ShadowKujakuMapView;
2930
import io.ona.kujaku.test.shadows.ShadowMapView;
3031

3132
import static org.junit.Assert.assertEquals;
3233
import static org.junit.Assert.assertFalse;
34+
import static org.junit.Assert.assertNull;
3335
import static org.junit.Assert.assertTrue;
3436

3537
/**
@@ -193,4 +195,16 @@ public void getLocationClientShouldCallCallbackWhenLocationClientIsNullAndWarmLo
193195
.onStarted(Mockito.any(ILocationClient.class));
194196
assertEquals(0, callbacks.size());
195197
}
198+
199+
@Test
200+
public void setOnFeatureLongClickListener() {
201+
assertNull(ReflectionHelpers.getField(kujakuMapView,"onFeatureLongClickListener"));
202+
assertNull(ReflectionHelpers.getField(kujakuMapView,"featureLongClickLayerIdFilters"));
203+
OnFeatureLongClickListener onFeatureLongClickListenerMock = Mockito.mock(OnFeatureLongClickListener.class);
204+
String[] layerIds = {"id1"};
205+
206+
kujakuMapView.setOnFeatureLongClickListener(onFeatureLongClickListenerMock, layerIds);
207+
assertEquals(onFeatureLongClickListenerMock, ReflectionHelpers.getField(kujakuMapView,"onFeatureLongClickListener"));
208+
assertEquals(layerIds, ReflectionHelpers.getField(kujakuMapView,"featureLongClickLayerIdFilters"));
209+
}
196210
}

0 commit comments

Comments
 (0)
Please sign in to comment.