Skip to content

Commit 6fc8e82

Browse files
committed
- added ability to get sensor information on demand from SOS server
1 parent b7f59da commit 6fc8e82

9 files changed

Lines changed: 228 additions & 89 deletions

File tree

Example/app/debug/app-debug.apk

2.27 MB
Binary file not shown.

Example/app/debug/output.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}]
1.94 MB
Binary file not shown.

Example/app/release/output.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]

Example/app/src/main/java/org/sofwerx/swe/example/PullExampleActivity.java

Lines changed: 90 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@
1010
import android.util.Log;
1111
import android.util.Pair;
1212
import android.view.View;
13+
import android.widget.AdapterView;
14+
import android.widget.ArrayAdapter;
1315
import android.widget.Button;
1416
import android.widget.CheckBox;
1517
import android.widget.ImageButton;
18+
import android.widget.ProgressBar;
1619
import android.widget.SeekBar;
20+
import android.widget.Spinner;
1721
import android.widget.TextView;
22+
import android.widget.Toast;
1823

1924
import androidx.appcompat.app.AppCompatActivity;
2025

@@ -26,6 +31,7 @@
2631
import org.sofwerx.ogc.sos.HttpHelper;
2732
import org.sofwerx.ogc.sos.OperationGetCapabilities;
2833
import org.sofwerx.ogc.sos.OperationGetCapabilitiesResponse;
34+
import org.sofwerx.ogc.sos.OperationGetResults;
2935
import org.sofwerx.ogc.sos.SensorMeasurement;
3036
import org.sofwerx.ogc.sos.SensorMeasurementTime;
3137
import org.sofwerx.ogc.sos.SensorResultTemplateField;
@@ -42,6 +48,7 @@
4248
public class PullExampleActivity extends AppCompatActivity implements SosMessageListener {
4349
private SosService sosService;
4450
private ArrayList<SosSensor> sensors;
51+
private SosSensor currentSensor = null;
4552

4653
@Override
4754
public void onDestroy() {
@@ -59,6 +66,10 @@ public void onDestroy() {
5966
private TextView textCannotSendWarning, textResult;
6067
private Button sendButton;
6168
private View viewMeasurements;
69+
private ProgressBar progressBar;
70+
private Spinner spinner;
71+
private ArrayAdapter spinnerArrayAdapter = null;
72+
private boolean isWaiting = false;
6273

6374
@Override
6475
protected void onCreate(Bundle savedInstanceState) {
@@ -74,6 +85,19 @@ protected void onCreate(Bundle savedInstanceState) {
7485
sendButton = findViewById(R.id.send);
7586
viewMeasurements = findViewById(R.id.viewMeasurements);
7687
sendButton.setOnClickListener(v -> sendQuery());
88+
spinner = findViewById(R.id.spinner);
89+
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
90+
@Override
91+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
92+
if ((sensors != null) && (position < sensors.size()))
93+
currentSensor = sensors.get(position);
94+
updateVisibility();
95+
}
96+
97+
@Override
98+
public void onNothingSelected(AdapterView<?> parent) { }
99+
});
100+
progressBar = findViewById(R.id.progressBar);
77101
checkSendIpc.setOnCheckedChangeListener((buttonView, isChecked) -> {
78102
updateVisibility();
79103
if (sosService != null)
@@ -89,6 +113,7 @@ protected void onCreate(Bundle savedInstanceState) {
89113
}
90114

91115
private void sendQuery() {
116+
isWaiting = true;
92117
if (sosService == null) {
93118
String url;
94119
if (checkSendNet.isChecked())
@@ -100,7 +125,11 @@ private void sendQuery() {
100125
log("Querying server...");
101126
sosService = new SosService(PullExampleActivity.this, null, url, username, sosPassword, true, checkSendIpc.isChecked());
102127
}
103-
sosService.broadcast(new OperationGetCapabilities());
128+
updateVisibility();
129+
if ((sensors == null) || sensors.isEmpty())
130+
sosService.broadcast(new OperationGetCapabilities());
131+
else
132+
sosService.broadcast(new OperationGetResults(currentSensor));
104133
}
105134

106135
private final static String PREFS_SEND_IPC = "ipc";
@@ -152,6 +181,28 @@ private void updateVisibility() {
152181
editSosPassword.setVisibility(View.GONE);
153182
}
154183
checkSendingPrereqs();
184+
progressBar.setVisibility(isWaiting?View.VISIBLE:View.GONE);
185+
if ((sensors == null) || sensors.isEmpty()) {
186+
spinner.setVisibility(View.INVISIBLE);
187+
sendButton.setText("Request List of Sensors");
188+
} else {
189+
if (spinnerArrayAdapter == null) {
190+
String[] values = new String[sensors.size()];
191+
for (int i=0;i<sensors.size();i++) {
192+
if ((sensors.get(i) == null) || (sensors.get(i).getId() == null))
193+
values[i] = "- unknown -";
194+
else
195+
values[i] = sensors.get(i).getId();
196+
}
197+
spinnerArrayAdapter = new ArrayAdapter(this,
198+
android.R.layout.simple_spinner_dropdown_item,
199+
values);
200+
spinner.setAdapter(spinnerArrayAdapter);
201+
spinner.setVisibility(View.VISIBLE);
202+
spinner.setSelection(0);
203+
}
204+
sendButton.setText("Request Sensor Results");
205+
}
155206
}
156207

157208
@SuppressLint("SetTextI18n")
@@ -228,49 +279,55 @@ private String getMissingPrereqs() {
228279

229280
@Override
230281
public void onSosOperationReceived(final AbstractSosOperation operation) {
282+
isWaiting = false;
231283
if (operation != null) {
232284
runOnUiThread(() -> {
233-
log(operation.getClass().getSimpleName() + " received");
234285
updateVisibility();
235286
});
236287
if (operation instanceof OperationGetCapabilitiesResponse) {
237288
ArrayList<SosSensor> opSensors = ((OperationGetCapabilitiesResponse) operation).getSensors();
238289
if ((opSensors != null) && !opSensors.isEmpty()) {
239290
Log.d(SosIpcTransceiver.TAG,opSensors.size()+" sensors described by server");
240291
for (SosSensor sensor:opSensors) {
241-
//TODO testing
242-
if ((sensor.getId() != null) && sensor.getId().contains("405-TORGI")) {
243-
Log.d(SosIpcTransceiver.TAG,"... to include a TORGI sensor. Requesting most recent readings...");
244-
sosService.getSensorResultFromServer(sensor);
245-
SosSensor current = findSensor(sensor);
246-
if (sensors == null)
247-
sensors = new ArrayList<>();
248-
if (current == null)
249-
sensors.add(sensor);
250-
else
251-
current.update(sensor);
252-
}
292+
SosSensor current = findSensor(sensor);
293+
if (sensors == null)
294+
sensors = new ArrayList<>();
295+
if (current == null)
296+
sensors.add(sensor);
297+
else
298+
current.update(sensor);
253299
}
254-
runOnUiThread(new Runnable() {
255-
@Override
256-
public void run() {
257-
if ((sensors != null) && !sensors.isEmpty()) {
258-
StringWriter out = new StringWriter();
259-
boolean first = true;
260-
for (SosSensor a:sensors) {
261-
if (first)
262-
first = false;
263-
else
264-
out.append("\r\n");
265-
out.append(a.toString());
266-
}
267-
log(out.toString());
268-
} else
269-
log("No sensor data received");
270-
}
300+
runOnUiThread(() -> {
301+
if ((sensors != null) && !sensors.isEmpty()) {
302+
Toast.makeText(PullExampleActivity.this,sensors.size()+" sensor"+((sensors.size()==1)?"":"s")+" available",Toast.LENGTH_SHORT).show();
303+
StringWriter out = new StringWriter();
304+
out.append("Available sensors:\r\n");
305+
boolean first = true;
306+
for (SosSensor a:sensors) {
307+
if (first)
308+
first = false;
309+
else
310+
out.append("\r\n");
311+
out.append(a.toString());
312+
}
313+
log(out.toString());
314+
log("\r\n");
315+
} else
316+
log("No sensor data received");
271317
});
272318
}
319+
} else if (operation instanceof OperationGetResults) {
320+
final SosSensor received = ((OperationGetResults)operation).getSensor();
321+
runOnUiThread(() -> {
322+
if (received == null)
323+
log("GetResults failed to get any sensor information");
324+
else
325+
log(received.toString());
326+
});
273327
}
328+
runOnUiThread(() -> {
329+
updateVisibility();
330+
});
274331
}
275332
}
276333

@@ -286,8 +343,10 @@ private SosSensor findSensor(SosSensor sensor) {
286343

287344
@Override
288345
public void onSosError(final String message) {
346+
isWaiting = false;
289347
runOnUiThread(() -> {
290348
log(message);
349+
updateVisibility();
291350
});
292351
}
293352

Example/app/src/main/res/layout/activity_pull.xml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@
9696

9797
<androidx.cardview.widget.CardView
9898
android:layout_width="match_parent"
99-
android:layout_height="0dp"
100-
android:layout_weight="0.3"
99+
android:layout_height="wrap_content"
101100
app:cardCornerRadius="4dp"
102101
app:cardElevation="4dp"
103102
android:padding="6dp"
@@ -134,6 +133,11 @@
134133
android:layout_margin="6dp"
135134
android:visibility="gone"/>
136135

136+
<Spinner
137+
android:id="@+id/spinner"
138+
android:layout_width="match_parent"
139+
android:layout_height="wrap_content" />
140+
137141
<Button
138142
android:id="@+id/send"
139143
android:layout_width="match_parent"
@@ -167,6 +171,13 @@
167171
android:textStyle="bold"
168172
android:padding="4dp"/>
169173

174+
<ProgressBar
175+
android:id="@+id/progressBar"
176+
style="?android:attr/progressBarStyleHorizontal"
177+
android:layout_width="match_parent"
178+
android:layout_height="wrap_content"
179+
android:indeterminate="true" />
180+
170181
<TextView
171182
android:id="@+id/result"
172183
android:layout_width="match_parent"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.sofwerx.ogc.sos;
2+
3+
import android.util.Pair;
4+
5+
import org.json.JSONException;
6+
import org.json.JSONObject;
7+
import org.w3c.dom.Document;
8+
import org.w3c.dom.Element;
9+
import org.w3c.dom.NodeList;
10+
11+
import java.util.ArrayList;
12+
13+
import javax.xml.parsers.ParserConfigurationException;
14+
15+
public class OperationGetResults extends AbstractSosOperation {
16+
private SosSensor sensor;
17+
18+
public OperationGetResults() {
19+
super();
20+
}
21+
22+
public OperationGetResults(SosSensor sensor) {
23+
super();
24+
this.sensor = sensor;
25+
}
26+
27+
@Override
28+
public boolean isValid() {
29+
return (sensor != null) && (sensor.getAssignedOffering() != null) && (sensor.getAssignedOffering() != null);
30+
}
31+
32+
public SosSensor getSensor() { return sensor; }
33+
public void setSensor(SosSensor sensor) { this.sensor = sensor; }
34+
35+
public ArrayList<Pair<String,String>> getPairs() {
36+
ArrayList<Pair<String,String>> pairs = new ArrayList<>();
37+
pairs.add(new Pair("service","SOS"));
38+
pairs.add(new Pair("version","2.0"));
39+
pairs.add(new Pair("request","GetResult"));
40+
pairs.add(new Pair("offering",sensor.getAssignedOffering()));
41+
pairs.add(new Pair("observedProperty",sensor.getFirstObservableProperty()));
42+
pairs.add(new Pair("responseFormat","application/json"));
43+
return pairs;
44+
}
45+
46+
public JSONObject toJSON() {
47+
ArrayList<Pair<String,String>> pairs = getPairs();
48+
JSONObject obj = new JSONObject();
49+
50+
try {
51+
for (Pair<String,String> pair:pairs) {
52+
obj.putOpt(pair.first,pair.second);
53+
}
54+
} catch (JSONException e) {
55+
e.printStackTrace();
56+
}
57+
58+
return obj;
59+
}
60+
61+
public void parse(JSONObject obj) {
62+
if ((sensor != null) && (obj != null))
63+
sensor.parseSensors(obj);
64+
}
65+
66+
@Override
67+
public void parse(Element getCapabilities) {
68+
//ignore, GetResults is handled as JSON only for now
69+
}
70+
71+
@Override
72+
public Document toXML() throws ParserConfigurationException {
73+
//ignored, GetResults is handled as JSON only for now
74+
return null;
75+
}
76+
}

SweLib/src/main/java/org/sofwerx/ogc/sos/SosSensor.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.util.Log;
44

5-
import org.json.JSONArray;
65
import org.json.JSONException;
76
import org.json.JSONObject;
87

@@ -326,8 +325,8 @@ public String toString() {
326325
StringWriter out = new StringWriter();
327326
if (id != null)
328327
out.append(id);
329-
out.append(": ");
330328
if ((measurements != null) && !measurements.isEmpty()) {
329+
out.append(": ");
331330
boolean first = true;
332331
for (SensorMeasurement measurement:measurements) {
333332
if (first)
@@ -336,8 +335,7 @@ public String toString() {
336335
out.append(", ");
337336
out.append(measurement.toString());
338337
}
339-
} else
340-
out.append("no measurements");
338+
}
341339
return out.toString();
342340
}
343341
}

0 commit comments

Comments
 (0)