Skip to content

Commit 813a924

Browse files
committed
Merge pull request #114 from AmericanRedCross/sprint_for_server
Sprint for Server OSM Filter
2 parents 67952b4 + 6585d49 commit 813a924

17 files changed

Lines changed: 165 additions & 317 deletions

File tree

MapboxAndroidSDK/src/main/java/com/spatialdev/osm/OSMMap.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,27 +206,30 @@ private void updateBoundingBox() {
206206
}
207207
}
208208

209-
public void addNode() {
209+
public OSMNode addNode() {
210210
LatLng center = mapView.getCenter();
211211
OSMNode node = new OSMNode(center);
212212
jtsModel.addOSMStandaloneNode(node);
213213
mapView.invalidate();
214+
return node;
214215
}
215216

216-
public void addNode(OSMNode node) {
217+
public OSMNode addNode(OSMNode node) {
217218
Marker marker = node.getMarker();
218219
if (marker != null) {
219220
marker.setVisibility(true);
220221
}
221222
jtsModel.addOSMStandaloneNode(node);
222223
mapView.invalidate();
224+
return node;
223225
}
224226

225-
public void moveNode() {
227+
public OSMNode moveNode() {
226228
LatLng center = mapView.getCenter();
227229
OSMNode selectedNode = (OSMNode)OSMElement.getSelectedElements().getFirst();
228230
selectedNode.move(jtsModel, center);
229231
mapView.invalidate();
232+
return selectedNode;
230233
}
231234

232235
public OSMNode deleteNode() {

MapboxAndroidSDK/src/main/java/com/spatialdev/osm/OSMUtil.java

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -14,75 +14,36 @@
1414
import com.spatialdev.osm.model.OSMElement;
1515
import com.spatialdev.osm.model.OSMWay;
1616

17+
import java.text.SimpleDateFormat;
1718
import java.util.ArrayList;
19+
import java.util.Date;
1820
import java.util.Iterator;
1921
import java.util.List;
22+
import java.util.Locale;
2023
import java.util.Map;
2124
import java.util.Set;
25+
import java.util.TimeZone;
2226

2327

2428
public class OSMUtil {
2529

26-
public static ArrayList<Object> createUIObjectsFromDataSet(OSMDataSet ds) {
27-
ArrayList<Object> uiObjects = new ArrayList<>();
28-
29-
/**
30-
* POLYGONS
31-
*/
32-
List<OSMWay> closedWays = ds.getClosedWays();
33-
for (OSMWay w : closedWays) {
34-
Iterator<OSMNode> nodeIterator = w.getNodeIterator();
35-
PathOverlay path = new PathOverlay();
36-
path.setOptimizePath(false); // optimizePath does not work for polys
37-
Paint paint = path.getPaint();
38-
paint.setStyle(Paint.Style.FILL);
39-
paint.setARGB(85, 95, 237, 140);
40-
while (nodeIterator.hasNext()) {
41-
OSMNode n = nodeIterator.next();
42-
LatLng latLng = n.getLatLng();
43-
path.addPoint(latLng);
44-
}
45-
uiObjects.add(path);
46-
}
47-
48-
49-
/**
50-
* LINES
51-
*/
52-
List<OSMWay> openWays = ds.getOpenWays();
53-
for (OSMWay w : openWays) {
54-
Iterator<OSMNode> nodeIterator = w.getNodeIterator();
55-
PathOverlay path = new PathOverlay();
56-
path.getPaint().setARGB(200, 209, 29, 119);
57-
while (nodeIterator.hasNext()) {
58-
OSMNode n = nodeIterator.next();
59-
LatLng latLng = n.getLatLng();
60-
path.addPoint(latLng);
61-
}
62-
uiObjects.add(path);
63-
}
30+
private static String dateFormatStr = "yyyy-MM-dd'T'HH:mm:ss'Z'";
31+
private static SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatStr, Locale.US);
6432

33+
public static String nowTimestamp() {
34+
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
35+
return dateFormat.format(new Date());
36+
}
6537

66-
/**
67-
* POINTS
68-
*/
69-
List<OSMNode> standaloneNodes = ds.getStandaloneNodes();
70-
for (OSMNode n : standaloneNodes) {
71-
LatLng latLng = n.getLatLng();
72-
Marker marker = new Marker(n.getClass().getSimpleName(), printTags(n), latLng);
73-
uiObjects.add(marker);
74-
}
7538

76-
return uiObjects;
77-
}
78-
79-
public static String printTags(OSMElement element) {
80-
Map<String, String> tags = element.getTags();
81-
Set<String> keys = tags.keySet();
82-
String str = "";
83-
for (String k : keys) {
84-
str += k + ": " + tags.get(k) + "\n";
85-
}
86-
return str;
39+
/**
40+
* Returns a timestamp without ':'.
41+
*
42+
* @return timestamp without ':'
43+
*/
44+
public static String nowFileTimestamp() {
45+
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
46+
String str = dateFormat.format(new Date());
47+
return str.replaceAll(":", "");
8748
}
8849
}

MapboxAndroidSDK/src/main/java/com/spatialdev/osm/model/OSMElement.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Map;
1111
import java.util.Set;
1212

13+
import com.spatialdev.osm.OSMUtil;
1314
import com.spatialdev.osm.renderer.OSMPath;
1415
import com.vividsolutions.jts.geom.Geometry;
1516

@@ -24,6 +25,7 @@ public abstract class OSMElement {
2425
private static LinkedList<OSMElement> modifiedElements = new LinkedList<>();
2526
private static LinkedList<OSMElement> modifiedElementsInInstance = new LinkedList<>();
2627

28+
2729
/**
2830
* When creating a new OSMElement, it needs to be assigned a unique negative ID within
2931
* the dataset. This should only be access by OSMElement#getUniqueNegativeId().
@@ -195,7 +197,14 @@ protected void setOsmElementXmlAttributes(XmlSerializer xmlSerializer) throws IO
195197
if (changeset != 0) {
196198
xmlSerializer.attribute(null, "changeset", String.valueOf(changeset));
197199
}
198-
if (timestamp != null) {
200+
/**
201+
* If the element just got modified, we want to set the time stamp when the record
202+
* is serialized. If it has not been modified or was modified in a previous session,
203+
* we want to stay with the previously recorded timestamp.
204+
*/
205+
if (modifiedInInstance) {
206+
xmlSerializer.attribute(null, "timestamp", OSMUtil.nowTimestamp());
207+
} else if (timestamp != null) {
199208
xmlSerializer.attribute(null, "timestamp", timestamp);
200209
}
201210
}

MapboxAndroidSDK/src/main/java/com/spatialdev/osm/model/OSMNode.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import java.io.IOException;
1616
import java.util.LinkedList;
1717
import java.util.List;
18+
import java.util.Timer;
19+
import java.util.TimerTask;
1820

1921
public class OSMNode extends OSMElement {
2022

@@ -152,6 +154,16 @@ public void select() {
152154
super.select();
153155
if (marker != null) {
154156
marker.setMarker(marker.getMapView().getContext().getResources().getDrawable(R.mipmap.maki_star_orange));
157+
} else {
158+
// Very wretched hack. Something is wrong with Mapbox Android SDK (Deprecated). Satisfies #98
159+
new Timer().schedule(new TimerTask() {
160+
@Override
161+
public void run() {
162+
if (marker != null) {
163+
marker.setMarker(marker.getMapView().getContext().getResources().getDrawable(R.mipmap.maki_star_orange));
164+
}
165+
}
166+
}, 100);
155167
}
156168
}
157169

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ Android mobile application for browsing OpenStreetMap features to create and edi
1414
- Can be launched by your XForm survey to select OSM features and create/edit tags within your survey collection workflow.
1515
- Tags and OSM ID are sent back to ODK Collect to be stored in survey data
1616

17-
18-
![OpenMapKit Flowchart](/docs/assets/OpenMapKit_flowchart.png)
19-
2017
## Documentation
2118

2219
See the [wiki](https://github.com/AmericanRedCross/openmapkit/wiki) for details on how to setup and load data into the app.

app/app.iml

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="openmapkit" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
2+
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="OpenMapKitAndroid" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
33
<component name="FacetManager">
44
<facet type="android-gradle" name="Android-Gradle">
55
<configuration>
@@ -65,43 +65,36 @@
6565
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
6666
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
6767
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
68-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
6968
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
70-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
7169
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
7270
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
73-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
7471
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.2.1/jars" />
7572
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/design/22.2.1/jars" />
7673
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.2.1/jars" />
7774
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
78-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
79-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
80-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
81-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
8275
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
83-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
8476
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
85-
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
8677
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
78+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
8779
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
8880
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
81+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
8982
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
9083
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
9184
</content>
9285
<orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
9386
<orderEntry type="sourceFolder" forTests="false" />
94-
<orderEntry type="library" exported="" name="design-22.2.1" level="project" />
95-
<orderEntry type="library" exported="" name="okhttp-2.4.0" level="project" />
96-
<orderEntry type="library" exported="" name="jts-1.13" level="project" />
97-
<orderEntry type="library" exported="" name="support-v4-22.2.1" level="project" />
98-
<orderEntry type="library" exported="" name="support-annotations-22.2.1" level="project" />
99-
<orderEntry type="library" exported="" name="okhttp-urlconnection-2.4.0" level="project" />
100-
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
101-
<orderEntry type="library" exported="" name="appcompat-v7-22.2.1" level="project" />
10287
<orderEntry type="library" exported="" name="disklrucache-2.0.2" level="project" />
88+
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
89+
<orderEntry type="library" exported="" name="okhttp-urlconnection-2.4.0" level="project" />
10390
<orderEntry type="library" exported="" name="guava-18.0" level="project" />
91+
<orderEntry type="library" exported="" name="support-v4-22.2.1" level="project" />
92+
<orderEntry type="library" exported="" name="okhttp-2.4.0" level="project" />
93+
<orderEntry type="library" exported="" name="support-annotations-22.2.1" level="project" />
10494
<orderEntry type="library" exported="" name="okio-1.4.0" level="project" />
95+
<orderEntry type="library" exported="" name="design-22.2.1" level="project" />
96+
<orderEntry type="library" exported="" name="jts-1.13" level="project" />
97+
<orderEntry type="library" exported="" name="appcompat-v7-22.2.1" level="project" />
10598
<orderEntry type="module" module-name="MapboxAndroidSDK" exported="" />
10699
</component>
107100
</module>

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,6 @@
3131
<data android:mimeType="text/plain" />
3232
</intent-filter>
3333
</activity>
34-
<activity
35-
android:name=".odkcollect.ODKCollectTagActivity"
36-
android:label="@string/title_activity_odkcollect_tag"
37-
android:parentActivityName=".MapActivity"
38-
android:windowSoftInputMode="stateHidden" >
39-
<meta-data
40-
android:name="android.support.PARENT_ACTIVITY"
41-
android:value="org.redcross.openmapkit.MapActivity" />
42-
</activity>
4334
<activity
4435
android:name=".tagswipe.TagSwipeActivity"
4536
android:label="@string/title_activity_tag_swipe"

app/src/main/java/org/redcross/openmapkit/MapActivity.java

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.support.design.widget.Snackbar;
1515
import android.support.v7.app.ActionBar;
1616
import android.support.v7.app.AppCompatActivity;
17+
import android.text.InputType;
1718
import android.view.Menu;
1819
import android.view.MenuItem;
1920
import android.view.TouchDelegate;
@@ -22,6 +23,7 @@
2223
import android.view.WindowManager;
2324
import android.widget.AdapterView;
2425
import android.widget.Button;
26+
import android.widget.EditText;
2527
import android.widget.ImageButton;
2628
import android.widget.LinearLayout;
2729
import android.widget.ListView;
@@ -30,6 +32,7 @@
3032

3133
import com.mapbox.mapboxsdk.geometry.BoundingBox;
3234
import com.mapbox.mapboxsdk.geometry.LatLng;
35+
import com.mapbox.mapboxsdk.overlay.Marker;
3336
import com.mapbox.mapboxsdk.views.MapView;
3437
import com.spatialdev.osm.OSMMap;
3538
import com.spatialdev.osm.events.OSMSelectionListener;
@@ -376,8 +379,10 @@ protected void initializeAddNodeButtons() {
376379
View.OnClickListener listener = new View.OnClickListener() {
377380
@Override
378381
public void onClick(View v) {
379-
osmMap.addNode();
382+
OSMNode node = osmMap.addNode();
380383
toggleNodeMode();
384+
node.select();
385+
identifyOSMFeature(node);
381386
}
382387
};
383388
addNodeMarkerBtn.setOnClickListener(listener);
@@ -452,14 +457,24 @@ private void toggleMoveNodeMode() {
452457
}
453458

454459
private void hideSelectedMarker() {
455-
OSMNode node = (OSMNode)OSMElement.getSelectedElements().getFirst();
456-
node.getMarker().setVisibility(false);
460+
LinkedList<OSMElement> selectedElements = OSMElement.getSelectedElements();
461+
if (selectedElements.size() < 1) return;
462+
OSMNode node = (OSMNode)selectedElements.getFirst();
463+
Marker marker = node.getMarker();
464+
if (marker != null) {
465+
node.getMarker().setVisibility(false);
466+
}
457467
mapView.invalidate();
458468
}
459469

460470
private void showSelectedMarker() {
461-
OSMNode node = (OSMNode)OSMElement.getSelectedElements().getFirst();
462-
node.getMarker().setVisibility(true);
471+
LinkedList<OSMElement> selectedElements = OSMElement.getSelectedElements();
472+
if (selectedElements.size() < 1) return;
473+
OSMNode node = (OSMNode)selectedElements.getFirst();
474+
Marker marker = node.getMarker();
475+
if (marker != null) {
476+
node.getMarker().setVisibility(true);
477+
}
463478
mapView.invalidate();
464479
}
465480

@@ -514,6 +529,36 @@ public void onClick(DialogInterface dialog, int id) {
514529
}
515530
}
516531

532+
private void inputOSMCredentials() {
533+
final SharedPreferences userNamePref = getSharedPreferences("org.redcross.openmapkit.USER_NAME", Context.MODE_PRIVATE);
534+
AlertDialog.Builder builder = new AlertDialog.Builder(this);
535+
builder.setTitle("OpenStreetMap User Name");
536+
builder.setMessage("Please enter your OpenStreetMap user name.");
537+
final EditText input = new EditText(this);
538+
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
539+
String userName = userNamePref.getString("userName", null);
540+
if (userName != null) {
541+
input.setText(userName);
542+
}
543+
builder.setView(input);
544+
builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
545+
@Override
546+
public void onClick(DialogInterface dialog, int id) {
547+
// just dismiss
548+
}
549+
});
550+
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
551+
@Override
552+
public void onClick(DialogInterface dialog, int which) {
553+
String userName = input.getText().toString();
554+
SharedPreferences.Editor editor = userNamePref.edit();
555+
editor.putString("userName", userName);
556+
editor.apply();
557+
}
558+
});
559+
builder.show();
560+
}
561+
517562
private void askIfDownloadOSM() {
518563
AlertDialog.Builder builder = new AlertDialog.Builder(this);
519564
builder.setTitle(R.string.downloadOSMTitle);
@@ -576,6 +621,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
576621
} else if (id == R.id.mbtilessettings) {
577622
basemap.presentMBTilesOptions();
578623
return true;
624+
} else if (id == R.id.osmcredentials) {
625+
inputOSMCredentials();
626+
return true;
579627
} else if (id == R.id.osmsettings) {
580628
presentOSMOptions();
581629
return true;

0 commit comments

Comments
 (0)