Skip to content

Commit a4f6895

Browse files
author
davidgraeff
committed
NFC working, new datastructures, json
* DeviceInfo, OutletInfo and new DeviceCollection are de/serializable via json * NFC selection dialog for transferred configured devices * Editing scenes work Missing: * Bug in saving scenes, where the wrong one is overwritten * Plugins
1 parent d353605 commit a4f6895

20 files changed

+696
-416
lines changed

.idea/workspace.xml

+318-290
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/app.apk

92.6 KB
Binary file not shown.

app/src/main/AndroidManifest.xml

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="oly.netpowerctrl"
4-
android:versionCode="4"
5-
android:versionName="1.3">
4+
android:versionCode="5"
5+
android:versionName="1.3a">
66

7+
<!-- Api level 16: Android 4.1 27. Juni 2012 -->
78
<uses-sdk
89
android:minSdkVersion="16"
910
android:targetSdkVersion="17" />

app/src/main/java/oly/netpowerctrl/anelservice/DeviceQuery.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import oly.netpowerctrl.R;
1313
import oly.netpowerctrl.datastructure.DeviceInfo;
1414
import oly.netpowerctrl.main.NetpowerctrlApplication;
15-
import oly.netpowerctrl.preferences.SharedPrefs;
1615
import oly.netpowerctrl.utils.ShowToast;
1716

1817
/**
@@ -84,7 +83,7 @@ public void run() {
8483
}
8584

8685
public static void sendBroadcastQuery(final Context context) {
87-
for (int port : SharedPrefs.getAllSendPorts(context))
86+
for (int port : NetpowerctrlApplication.instance.getAllSendPorts())
8887
sendQuery(context, "255.255.255.255", port);
8988
}
9089
}

app/src/main/java/oly/netpowerctrl/anelservice/NetpowerctrlService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.List;
1111

1212
import oly.netpowerctrl.datastructure.DeviceInfo;
13-
import oly.netpowerctrl.preferences.SharedPrefs;
13+
import oly.netpowerctrl.main.NetpowerctrlApplication;
1414

1515
public class NetpowerctrlService extends Service {
1616
private List<DiscoveryThread> discoveryThreads = new ArrayList<DiscoveryThread>();
@@ -89,7 +89,7 @@ public boolean onUnbind(Intent intent) {
8989
private void startDiscoveryThreads() {
9090
// only start if not yet running
9191
if (discoveryThreads.size() == 0) {
92-
for (int port : SharedPrefs.getAllReceivePorts(this)) {
92+
for (int port : NetpowerctrlApplication.instance.getAllReceivePorts()) {
9393
DiscoveryThread thr = new DiscoveryThread(port, this);
9494
thr.start();
9595
discoveryThreads.add(thr);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package oly.netpowerctrl.datastructure;
2+
3+
import android.util.JsonReader;
4+
import android.util.JsonWriter;
5+
6+
import java.io.ByteArrayInputStream;
7+
import java.io.ByteArrayOutputStream;
8+
import java.io.IOException;
9+
import java.io.InputStreamReader;
10+
import java.io.OutputStreamWriter;
11+
import java.io.UnsupportedEncodingException;
12+
import java.util.ArrayList;
13+
14+
/**
15+
* Contains DeviceInfos. Used for NFC and backup transfers
16+
*/
17+
public class DeviceCollection {
18+
public static final int PROTOCOLVERSION = 1;
19+
public ArrayList<DeviceInfo> devices;
20+
21+
public static DeviceCollection fromDevices(ArrayList<DeviceInfo> devices) {
22+
DeviceCollection dc = new DeviceCollection();
23+
dc.devices = devices;
24+
return dc;
25+
}
26+
27+
public static DeviceCollection fromJSON(String devices_as_string) throws IOException {
28+
DeviceCollection dc = new DeviceCollection();
29+
30+
// Get JsonReader from String
31+
byte[] bytes;
32+
try {
33+
bytes = devices_as_string.getBytes("UTF-8");
34+
} catch (UnsupportedEncodingException ignored) {
35+
return null;
36+
}
37+
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
38+
JsonReader reader = new JsonReader(new InputStreamReader(bais));
39+
40+
dc.devices = new ArrayList<DeviceInfo>();
41+
42+
reader.beginObject();
43+
while (reader.hasNext()) {
44+
String name = reader.nextName();
45+
if (name.equals("devices")) {
46+
reader.beginArray();
47+
while (reader.hasNext()) {
48+
dc.devices.add(DeviceInfo.fromJSON(reader));
49+
}
50+
reader.endArray();
51+
} else {
52+
reader.skipValue();
53+
}
54+
}
55+
reader.endObject();
56+
return dc;
57+
}
58+
59+
public String toJSON() throws IOException {
60+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
61+
JsonWriter writer;
62+
try {
63+
writer = new JsonWriter(new OutputStreamWriter(baos, "UTF-8"));
64+
} catch (UnsupportedEncodingException e) {
65+
return null;
66+
}
67+
68+
writer.beginObject();
69+
writer.name("version").value(PROTOCOLVERSION);
70+
writer.name("devices").beginArray();
71+
for (DeviceInfo di : devices) {
72+
di.toJSON(writer);
73+
}
74+
writer.endArray();
75+
writer.endObject();
76+
77+
writer.close();
78+
79+
return baos.toString();
80+
}
81+
}

app/src/main/java/oly/netpowerctrl/datastructure/DeviceInfo.java

+63-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import android.content.Context;
44
import android.os.Parcel;
55
import android.os.Parcelable;
6+
import android.util.JsonReader;
7+
import android.util.JsonWriter;
68

9+
import java.io.IOException;
710
import java.util.ArrayList;
811
import java.util.List;
912
import java.util.UUID;
@@ -62,7 +65,7 @@ public DeviceInfo(Context cx) {
6265
this();
6366
DeviceName = cx.getResources().getString(R.string.default_device_name);
6467
SendPort = SharedPrefs.getDefaultSendPort(cx);
65-
ReceivePort = SharedPrefs.getDefaultRecvPort(cx);
68+
ReceivePort = SharedPrefs.getDefaultReceivePort(cx);
6669
}
6770

6871
public DeviceInfo(DeviceInfo other) {
@@ -152,4 +155,63 @@ public void updateByDeviceCommand(DeviceCommand c) {
152155
oi.State = c.getIsOn(oi.OutletNumber);
153156
}
154157
}
158+
159+
public static DeviceInfo fromJSON(JsonReader reader) throws IOException {
160+
reader.beginObject();
161+
DeviceInfo di = new DeviceInfo();
162+
while (reader.hasNext()) {
163+
String name = reader.nextName();
164+
if (name.equals("uuid")) {
165+
di.uuid = UUID.fromString(reader.nextString());
166+
} else if (name.equals("DeviceName")) {
167+
di.DeviceName = reader.nextString();
168+
} else if (name.equals("HostName")) {
169+
di.HostName = reader.nextString();
170+
} else if (name.equals("MacAddress")) {
171+
di.MacAddress = reader.nextString();
172+
} else if (name.equals("UserName")) {
173+
di.UserName = reader.nextString();
174+
} else if (name.equals("Password")) {
175+
di.Password = reader.nextString();
176+
} else if (name.equals("DefaultPorts")) {
177+
di.DefaultPorts = reader.nextBoolean();
178+
} else if (name.equals("SendPort")) {
179+
di.SendPort = reader.nextInt();
180+
} else if (name.equals("ReceivePort")) {
181+
di.ReceivePort = reader.nextInt();
182+
} else if (name.equals("Outlets")) {
183+
di.Outlets = new ArrayList<OutletInfo>();
184+
reader.beginArray();
185+
while (reader.hasNext()) {
186+
di.Outlets.add(OutletInfo.fromJSON(reader, di));
187+
}
188+
reader.endArray();
189+
} else {
190+
reader.skipValue();
191+
}
192+
}
193+
194+
di.Configured = true;
195+
reader.endObject();
196+
return di;
197+
}
198+
199+
public void toJSON(JsonWriter writer) throws IOException {
200+
writer.beginObject();
201+
writer.name("uuid").value(uuid.toString());
202+
writer.name("DeviceName").value(DeviceName);
203+
writer.name("HostName").value(HostName);
204+
writer.name("MacAddress").value(MacAddress);
205+
writer.name("UserName").value(UserName);
206+
writer.name("Password").value(Password);
207+
writer.name("DefaultPorts").value(DefaultPorts);
208+
writer.name("SendPort").value(SendPort);
209+
writer.name("ReceivePort").value(ReceivePort);
210+
writer.name("Outlets").beginArray();
211+
for (OutletInfo oi : Outlets) {
212+
oi.toJSON(writer);
213+
}
214+
writer.endArray();
215+
writer.endObject();
216+
}
155217
}

app/src/main/java/oly/netpowerctrl/datastructure/OutletCommandGroup.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ public OutletCommandGroup() {
2222
commands = new ArrayList<OutletCommand>();
2323
}
2424

25-
@SuppressWarnings("unused")
26-
public boolean equals(OutletCommandGroup other) {
27-
return uuid.equals(other.uuid);
25+
@Override
26+
public boolean equals(Object other) {
27+
return uuid.equals(((OutletCommandGroup) other).uuid);
2828
}
2929

3030
@SuppressWarnings("unused")
31-
public boolean equals(UUID uuid) {
32-
return uuid.equals(uuid);
31+
public boolean equals(OutletCommandGroup other) {
32+
return uuid.equals(other.uuid);
3333
}
3434

3535
public String toString() {

app/src/main/java/oly/netpowerctrl/datastructure/OutletInfo.java

+44
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import android.os.Parcel;
44
import android.os.Parcelable;
5+
import android.util.JsonReader;
6+
import android.util.JsonWriter;
7+
8+
import java.io.IOException;
59

610
//this class holds the info about a single outlet
711
public class OutletInfo implements Parcelable, Comparable {
@@ -89,5 +93,45 @@ public int compareTo(Object o) {
8993
return positionRequest < other.positionRequest ? -1 : 1;
9094
}
9195
}
96+
97+
public static OutletInfo fromJSON(JsonReader reader, DeviceInfo di) throws IOException {
98+
reader.beginObject();
99+
OutletInfo oi = new OutletInfo(di);
100+
while (reader.hasNext()) {
101+
String name = reader.nextName();
102+
if (name.equals("OutletNumber")) {
103+
oi.OutletNumber = reader.nextInt();
104+
} else if (name.equals("Description")) {
105+
oi.Description = reader.nextString();
106+
} else if (name.equals("UserDescription")) {
107+
oi.UserDescription = reader.nextString();
108+
} else if (name.equals("State")) {
109+
oi.State = reader.nextBoolean();
110+
} else if (name.equals("Disabled")) {
111+
oi.Disabled = reader.nextBoolean();
112+
} else if (name.equals("Hidden")) {
113+
oi.Hidden = reader.nextBoolean();
114+
} else if (name.equals("positionRequest")) {
115+
oi.positionRequest = reader.nextInt();
116+
} else {
117+
reader.skipValue();
118+
}
119+
}
120+
121+
reader.endObject();
122+
return oi;
123+
}
124+
125+
public void toJSON(JsonWriter writer) throws IOException {
126+
writer.beginObject();
127+
writer.name("OutletNumber").value(OutletNumber);
128+
writer.name("Description").value(Description);
129+
writer.name("UserDescription").value(UserDescription);
130+
writer.name("State").value(State);
131+
writer.name("Disabled").value(Disabled);
132+
writer.name("Hidden").value(Hidden);
133+
writer.name("positionRequest").value(positionRequest);
134+
writer.endObject();
135+
}
92136
}
93137

app/src/main/java/oly/netpowerctrl/listadapter/ScenesListAdapter.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ScenesListAdapter extends BaseAdapter implements OnClickListener {
2828
public ScenesListAdapter(Context context) {
2929
this.context = context;
3030
inflater = LayoutInflater.from(context);
31-
scenes = SharedPrefs.ReadGroups(context);
31+
scenes = SharedPrefs.ReadScenes(context);
3232
}
3333

3434
@Override
@@ -98,19 +98,19 @@ public void addScene(OutletCommandGroup data) {
9898
} else
9999
scenes.add(data);
100100

101-
SharedPrefs.SaveGroups(scenes, context);
101+
SharedPrefs.SaveScenes(scenes, context);
102102
notifyDataSetChanged();
103103
}
104104

105105
public void removeScene(int position) {
106106
scenes.remove(position);
107-
SharedPrefs.SaveGroups(scenes, context);
107+
SharedPrefs.SaveScenes(scenes, context);
108108
notifyDataSetChanged();
109109
}
110110

111111
public void deleteAll() {
112112
scenes.clear();
113-
SharedPrefs.SaveGroups(scenes, context);
113+
SharedPrefs.SaveScenes(scenes, context);
114114
notifyDataSetChanged();
115115
}
116116

app/src/main/java/oly/netpowerctrl/main/NetpowerctrlActivity.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,24 @@
3333
import android.support.v4.app.ActionBarDrawerToggle;
3434
import android.support.v4.view.GravityCompat;
3535
import android.support.v4.widget.DrawerLayout;
36+
import android.util.Log;
3637
import android.view.Menu;
3738
import android.view.MenuItem;
3839
import android.view.View;
3940
import android.widget.AdapterView;
4041
import android.widget.ListView;
4142
import android.widget.TextView;
4243

44+
import java.io.IOException;
45+
4346
import oly.netpowerctrl.R;
4447
import oly.netpowerctrl.anelservice.DeviceQuery;
48+
import oly.netpowerctrl.datastructure.DeviceCollection;
4549
import oly.netpowerctrl.listadapter.AdapterController;
4650
import oly.netpowerctrl.listadapter.DrawerAdapter;
4751
import oly.netpowerctrl.preferences.PreferencesFragment;
4852
import oly.netpowerctrl.preferences.SharedPrefs;
53+
import oly.netpowerctrl.utils.NFC;
4954

5055
public class NetpowerctrlActivity extends Activity implements NfcAdapter.CreateNdefMessageCallback {
5156
public static NetpowerctrlActivity _this = null;
@@ -177,9 +182,15 @@ protected void onPause() {
177182

178183
@Override
179184
public NdefMessage createNdefMessage(NfcEvent event) {
180-
String text = ("Beam me up, Android!\n\n" +
181-
"Beam Time: " + System.currentTimeMillis());
182-
//TODO nfc send
185+
String text = null;
186+
try {
187+
text = DeviceCollection.fromDevices(NetpowerctrlApplication.instance.configuredDevices).toJSON();
188+
Log.w("json", text);
189+
} catch (IOException ignored) {
190+
Log.w("json", ignored.toString());
191+
return null;
192+
}
193+
183194
return new NdefMessage(
184195
NdefRecord.createApplicationRecord("oly.netpowerctrl"),
185196
NdefRecord.createMime("application/oly.netpowerctrl", text.getBytes())
@@ -193,14 +204,11 @@ public void onResume() {
193204
String intentAction = getIntent().getAction();
194205
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentAction)) {
195206
Intent intent = getIntent();
196-
Parcelable[] rawMessages = intent.getParcelableArrayExtra(
197-
NfcAdapter.EXTRA_NDEF_MESSAGES);
207+
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
198208
// only one message sent during the beam
199209
assert rawMessages != null;
200210
NdefMessage msg = (NdefMessage) rawMessages[0];
201-
@SuppressWarnings("unused")
202-
String beamedDeviceConfigurations = new String(msg.getRecords()[1].getPayload());
203-
//TODO nfc read
211+
NFC.showSelectionDialog(this, new String(msg.getRecords()[1].getPayload()));
204212
}
205213

206214
// Start listener and request new device states

0 commit comments

Comments
 (0)