Skip to content

Commit 6b24fb4

Browse files
author
David Gräff
committed
Fix NullPointerException if getHostByName failed
1 parent 6a12559 commit 6b24fb4

File tree

7 files changed

+283
-250
lines changed

7 files changed

+283
-250
lines changed

.idea/workspace.xml

Lines changed: 206 additions & 207 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/app.iml

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
<component name="FacetManager">
44
<facet type="android" name="Android">
55
<configuration>
6-
<option name="SELECTED_BUILD_VARIANT" value="release" />
7-
<option name="ASSEMBLE_TASK_NAME" value="assembleRelease" />
8-
<option name="COMPILE_JAVA_TASK_NAME" value="compileReleaseJava" />
9-
<option name="SOURCE_GEN_TASK_NAME" value="generateReleaseSources" />
6+
<option name="SELECTED_BUILD_VARIANT" value="debug" />
7+
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
8+
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
9+
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
10+
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
1011
<option name="ALLOW_USER_CONFIGURATION" value="false" />
1112
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
1213
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
@@ -21,21 +22,26 @@
2122
</facet>
2223
</component>
2324
<component name="NewModuleRootManager" inherit-compiler-output="false">
24-
<output url="file://$MODULE_DIR$/build/classes/release" />
25+
<output url="file://$MODULE_DIR$/build/classes/debug" />
2526
<exclude-output />
2627
<content url="file://$MODULE_DIR$">
27-
<sourceFolder url="file://$MODULE_DIR$/build/source/r/release" isTestSource="false" generated="true" />
28-
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/release" isTestSource="false" generated="true" />
29-
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/release" isTestSource="false" generated="true" />
30-
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/release" isTestSource="false" generated="true" />
31-
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/release" type="java-resource" />
32-
<sourceFolder url="file://$MODULE_DIR$/src/release/aidl" isTestSource="false" />
33-
<sourceFolder url="file://$MODULE_DIR$/src/release/assets" isTestSource="false" />
34-
<sourceFolder url="file://$MODULE_DIR$/src/release/java" isTestSource="false" />
35-
<sourceFolder url="file://$MODULE_DIR$/src/release/jni" isTestSource="false" />
36-
<sourceFolder url="file://$MODULE_DIR$/src/release/rs" isTestSource="false" />
37-
<sourceFolder url="file://$MODULE_DIR$/src/release/res" type="java-resource" />
38-
<sourceFolder url="file://$MODULE_DIR$/src/release/resources" type="java-resource" />
28+
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" generated="true" />
29+
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" generated="true" />
30+
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" generated="true" />
31+
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" generated="true" />
32+
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" type="java-resource" />
33+
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test/debug" isTestSource="true" />
34+
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test/debug" isTestSource="true" />
35+
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test/debug" isTestSource="true" />
36+
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test/debug" isTestSource="true" />
37+
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test/debug" type="java-test-resource" />
38+
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
39+
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
40+
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
41+
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
42+
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
43+
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
44+
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
3945
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
4046
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
4147
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +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="20"
5-
android:versionName="2.2">
4+
android:versionCode="22"
5+
android:versionName="2.2b">
66

7-
<!-- Api level 14: Android 4.0 15. Dezember 2011 -->
7+
<!-- Api level 14: Android 4.0 15. Dezember 2011 -->
88
<!-- Api level 16: Android 4.1 27. Juni 2012 -->
99
<!--<uses-sdk
1010
android:minSdkVersion="14"

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class DeviceSend {
3333
private static final int INQUERY_REQUEST = 0;
3434
private static final int INQUERY_BROADCAST_REQUEST = 1;
3535
private static final int NETWORK_UNREACHABLE = 2;
36+
private static final int NETWORK_UNKNOWN_HOSTNAME = 3;
3637

3738
// Singleton
3839
static DeviceSend mInstance = new DeviceSend();
@@ -126,6 +127,7 @@ class SendJob extends Job {
126127

127128
SendJob(InetAddress ip, int port, byte[] message, boolean broadcast, int errorID) {
128129
this.ip = ip;
130+
this.hostname = ip.getHostAddress();
129131
this.message = message;
130132
this.port = port;
131133
this.broadcast = broadcast;
@@ -143,40 +145,47 @@ class SendJob extends Job {
143145
@Override
144146
void process() {
145147
try {
146-
if (hostname != null && hostname.length() > 0) {
148+
if (ip == null) {
147149
ip = InetAddress.getByName(hostname);
148-
hostname = "";
149150
}
150151
datagramSocket.setBroadcast(broadcast);
151152
datagramSocket.send(new DatagramPacket(message, message.length, ip, port));
152153
} catch (final SocketException e) {
153154
if (e.getMessage().contains("ENETUNREACH"))
154-
onError(NETWORK_UNREACHABLE, ip, port, e);
155+
onError(NETWORK_UNREACHABLE, ip.getHostAddress(), port, e);
155156
else {
156-
e.printStackTrace();
157-
onError(errorID, ip, port, e);
157+
onError(errorID, ip.getHostAddress(), port, e);
158158
}
159+
} catch (final UnknownHostException e) {
160+
onError(NETWORK_UNKNOWN_HOSTNAME, hostname, port, e);
159161
} catch (final Exception e) {
160162
e.printStackTrace();
161-
onError(errorID, ip, port, e);
163+
onError(errorID, hostname, port, e);
162164
}
163165
}
164166
}
165167

166-
private void onError(int errorID, InetAddress ip, int port, Exception e) {
168+
private void onError(int errorID, String ip, int port, Exception e) {
167169
Context context = NetpowerctrlApplication.instance;
170+
if (context == null)
171+
return;
172+
String exceptionString = (e == null || e.getMessage() == null) ? "" : e.getMessage();
168173
switch (errorID) {
169174
case INQUERY_REQUEST:
170175
ShowToast.FromOtherThread(context,
171-
context.getResources().getString(R.string.error_sending_inquiry, ip.getHostAddress()) + ": " + e.getMessage());
176+
context.getResources().getString(R.string.error_sending_inquiry, ip) + ": " + exceptionString);
172177
break;
173178
case INQUERY_BROADCAST_REQUEST:
174179
ShowToast.FromOtherThread(context,
175-
context.getResources().getString(R.string.error_sending_broadcast_inquiry, port) + ": " + e.getMessage());
180+
context.getResources().getString(R.string.error_sending_broadcast_inquiry, port) + ": " + exceptionString);
176181
break;
177182
case NETWORK_UNREACHABLE:
178183
ShowToast.FromOtherThread(context,
179-
context.getResources().getString(R.string.error_not_in_range, ip.getHostAddress()));
184+
context.getResources().getString(R.string.error_not_in_range, ip));
185+
break;
186+
case NETWORK_UNKNOWN_HOSTNAME:
187+
ShowToast.FromOtherThread(context,
188+
context.getResources().getString(R.string.error_not_in_range, ip) + ": " + exceptionString);
180189
break;
181190
}
182191
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
mode = ReportingInteractionMode.TOAST,
4343
mailTo = "[email protected]",
4444
forceCloseDialogAfterToast = false, // optional, default false
45+
additionalSharedPreferences = {SharedPrefs.PREF_BASENAME, SharedPrefs.PREF_GROUPS_BASENAME, SharedPrefs.PREF_WIDGET_BASENAME},
4546
resToastText = R.string.crash_toast_text)
4647
public class NetpowerctrlApplication extends Application implements DeviceUpdate, DeviceError {
4748
public static NetpowerctrlApplication instance;

app/src/main/res/raw-de/help.txt

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,19 @@ voreingestellt und passen zu den Einstellungen dieser Anwendung.</p>
1616
<p>Deine Steckdosenleisten sollten nun auftauchen. Klicke auf das Icon nebem dem Namen
1717
der Leiste. Im folgenden Bildschirm kannst du den Namen, den Nutzernamen, das Passwort und
1818
gfs. individuelle UDP Ports einstellen, sowie die IP Adresse kontrollieren. Vor dem Speichern
19-
ist ein Klick auf den <b>"Test"</b> Knopf oben rechts empfohlen.</p>
19+
ist ein Klick auf den <b>"Test"</b> Knopf empfohlen.</p>
2020

2121
<h3>Steckdosen umschalten</h3>
2222
<blockquote>Wähle <b>"Alle Steckdosen"</b> aus dem Navigationsmenü.</blockquote>
23-
Wenn du auf einen Steckdoseneintrag anklickst, ändert dieser sofort seinen Status (Aus -> An, oder von An -> Aus).
24-
Klickst du lange auf einen Eintrag erscheint ein Auswahlmenü. Hier kannst du einzelne
25-
Steckdosen umbenennen, Verstecken oder deren Position innerhalb der Liste verändern.
23+
Wenn du auf den Schalter eines Steckdoseneintrags klickst,
24+
ändert dieser sofort seinen Status (Aus nach An, oder von An nach Aus).
25+
Klickst du auf den Namen eines Eintrags erscheint ein Auswahlmenü. Hier kannst du einzelne
26+
Steckdosen umbenennen oder verstecken. Das Aktionsmenü oben rechts ermöglicht dir
27+
das Neuanordnen der Steckdosen und das Anzeigen von versteckten Einträgen.
28+
Klickst du auf das Plus-Icon im oberen, rechten Bereich, so kannst du die aktuellen
29+
Steckdosenzustände als Szene abspeichern.
2630

27-
<h3>Szenen und Startbildschirm Verknüpfung</h3>
31+
<h3>Szenen und Startbildschirm Verknüpfungen</h3>
2832
<blockquote>Wähle <b>"Szenen"</b> aus dem Navigationsmenü.</blockquote>
2933

3034
<p>
@@ -38,20 +42,34 @@ Szenen-Liste auf.
3842
</p>
3943

4044
<p>
41-
Wähle das Icon neben dem Szenennamen für eine Auswahl: Du kannst hier eine Szene entfernen oder bearbeiten.
45+
Wähle das Icon neben dem Szenennamen für eine Auswahl: Du kannst hier eine Szene entfernen, bearbeiten
46+
oder eine Kopie auf dem Startbildschirm anlegen. Diese Kopie wird nicht verändert, wenn du die ursprüngliche
47+
Szene entfernst oder bearbeitest.
4248
</p>
4349

4450
<p>
45-
Möchtest du vom Startbildschirm aus eine Szene auslösen, dann ist dies ebenfalls möglich. Dafür
46-
nutzen wir Android Verknüpfungen. Wie genau du eine Verknüpfung einrichtest,
51+
Bei vielen Startbildschirmen kannst du auch direkt eine Szene erstellen, welche gar nicht erst in der Szenen-Liste
52+
der App auftaucht. Wie genau du eine Verknüpfung einrichtest,
4753
hängt von deiner Startbildschirm-Anwendung ab. Normalerweise klickst du lange auf eine freie Fläche und
48-
ein Dialog taucht auf. Dort wählst du "Verknüpfung" oder "Shortcut". In der anschließenden Liste wählst du
49-
diese App aus.
54+
ein Dialog oder eine Auswahl taucht auf. Dort wählst du "Verknüpfung" oder "Shortcut". In der anschließenden Liste wählst du
55+
"Szene für Net-PwrCtrl" aus.
56+
</p>
57+
58+
<h3>Widget für eine Steckdose auf dem Startbildschirm</h3>
59+
<p>Du kannst auf dem Startbildschirm ein Widget
60+
(Icon und Text, welcher von dieser Anwendung jederzeit verändert werden darf) anlegen. Wir bieten ein
61+
Widget an, welches den Zustand einer zuvor ausgewählten Steckdose anzeigt. Der Zustand kann sein: An,
62+
Aus, Nicht erreichbar. Du kannst mehrere Widgets für gleiche und unterschiedliche Steckdosen anlegen.</p>
63+
64+
<p>In den Einstellungen muss die Option "Aktuell halten" eingeschaltet sein, wenn du möchtest, dass das
65+
Widget so gut es geht versucht den aktuellen Zustand anzuzeigen. Das kostet allerdings etwas mehr Energie.
66+
Außerdem kannst du für jedes angelegte Widget die Icons für den Zustand An, Aus, Nicht erreichbar
67+
gegen eigene Icons austauschen.
5068
</p>
5169

5270
<h3>Backup der Einstellungen</h3>
5371
<p>Deine Geräte Einstellungen werden automatisch mit dem Google Backup Service gesichert.
54-
Bei einer Neuinstallation der Anwendung oder des Mobiltelefons werden die Daten wiederhergestellt.
72+
Bei einer Neuinstallation oder Aktualisierung der Anwendung oder des Mobiltelefons werden die Daten wiederhergestellt.
5573
Im Moment ist es nicht möglich, die Einstellungen manuell zu sichern und wiederherzustellen. Diese
5674
Funktion ist geplant.</p>
5775

@@ -71,6 +89,6 @@ Wenn <i>Beam</i> bestätigt worden ist, dann können auf dem Zielgerät die gew
7189
eingerichtet werden.</p>
7290

7391
<h3>Autoren</h3>
74-
© 2013 <b>David Gräff</b><br>
92+
© 2013-2014 <b>David Gräff</b><br>
7593
© 2012 <b><a href="http://www.nittka.com">Oliver Nittka</a></b><br><br>
7694
Einige Bilder von <a href="http://www.clker.com/">www.clker.com</a> (public domain)

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@
208208
<string name="widget_image_on">Widget image: On state</string>
209209
<string name="widget_image_off">Widget image: Off state</string>
210210
<string name="widget_image_not_reachable">Widget image: Not available</string>
211-
<string name="crash_toast_text">Ooooops ! I crashed, but a report has been sent to my developer to help fix the issue!</string>
211+
<string name="crash_toast_text">Ooooops ! I crashed, but a report can be sent to my developer to help fix the issue!</string>
212212
<string name="outlet_to_scene_title">Create scene</string>
213213
<string name="outlet_to_scene_message">A scene is created with the current state of all listed, non-hidden outlets. Please enter a scene name.</string>
214214

0 commit comments

Comments
 (0)