From 318ad4a759d847677bc1773dbe3b3ea865008e77 Mon Sep 17 00:00:00 2001 From: Moritz Warning Date: Wed, 25 Mar 2020 18:55:59 +0100 Subject: [PATCH] move wifi/bluetooth detection into RequestHandler this moves more functionalities closer together and needs to introduces a new door reply state called DISABLED --- .../example/trigger/BluetoothDoorSetup.java | 8 ++-- .../com/example/trigger/BluetoothTools.java | 20 ++++----- .../java/com/example/trigger/DoorReply.java | 7 +-- .../com/example/trigger/HttpsDoorSetup.java | 8 ++-- .../com/example/trigger/MainActivity.java | 45 +++---------------- .../com/example/trigger/MqttDoorSetup.java | 8 ++-- .../com/example/trigger/NukiDoorSetup.java | 8 ++-- .../com/example/trigger/SshDoorSetup.java | 27 +++++++---- .../java/com/example/trigger/WifiTools.java | 22 ++++----- .../bluetooth/BluetoothRequestHandler.java | 16 ++++--- .../trigger/https/HttpsRequestHandler.java | 8 ++++ .../trigger/mqtt/MqttRequestHandler.java | 6 +++ .../trigger/ssh/SshRequestHandler.java | 7 +++ 13 files changed, 96 insertions(+), 94 deletions(-) diff --git a/app/src/main/java/com/example/trigger/BluetoothDoorSetup.java b/app/src/main/java/com/example/trigger/BluetoothDoorSetup.java index 843e21f3..cb9e34d2 100644 --- a/app/src/main/java/com/example/trigger/BluetoothDoorSetup.java +++ b/app/src/main/java/com/example/trigger/BluetoothDoorSetup.java @@ -94,10 +94,12 @@ public DoorState parseReply(DoorReply reply) { } else { return new DoorState(StateCode.UNKNOWN, msg); } - default: - // should not happen - return new DoorState(StateCode.UNKNOWN, msg); + case DISABLED: + return new DoorState(StateCode.DISABLED, msg); } + + // keep compiler quiet :/ + return null; } @Override diff --git a/app/src/main/java/com/example/trigger/BluetoothTools.java b/app/src/main/java/com/example/trigger/BluetoothTools.java index 3553806a..c74afcaa 100644 --- a/app/src/main/java/com/example/trigger/BluetoothTools.java +++ b/app/src/main/java/com/example/trigger/BluetoothTools.java @@ -8,23 +8,21 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import com.example.trigger.Log; - public class BluetoothTools { static final String TAG = "BluetoothTools"; - private BluetoothAdapter bluetoothAdapter; + private static BluetoothAdapter adapter; - BluetoothTools(Context context) { - bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - - if (bluetoothAdapter == null) { - // Device doesn't support Bluetooth - } + static void init(Context context) { + adapter = BluetoothAdapter.getDefaultAdapter(); } - public boolean isEnabled() { - return bluetoothAdapter != null && bluetoothAdapter.isEnabled(); + public static boolean isEnabled() { + return adapter != null && adapter.isEnabled(); + } + + public static boolean isSupported() { + return (adapter != null); } public static BluetoothSocket createRfcommSocket(BluetoothDevice device) { diff --git a/app/src/main/java/com/example/trigger/DoorReply.java b/app/src/main/java/com/example/trigger/DoorReply.java index 7daea88d..7aa765c3 100644 --- a/app/src/main/java/com/example/trigger/DoorReply.java +++ b/app/src/main/java/com/example/trigger/DoorReply.java @@ -9,15 +9,12 @@ public class DoorReply { public enum ReplyCode { LOCAL_ERROR, // could establish a connection for some reason REMOTE_ERROR, // the door send some error - SUCCESS // the door send some message that has yet to be parsed + SUCCESS, // the door send some message that has yet to be parsed + DISABLED // Internet, WiFi or Bluetooth disabled or not supported } public DoorReply(ReplyCode code, String message) { this.code = code; this.message = message; } - - public static DoorReply internal_error() { - return new DoorReply(ReplyCode.LOCAL_ERROR, "Internal Error"); - } } diff --git a/app/src/main/java/com/example/trigger/HttpsDoorSetup.java b/app/src/main/java/com/example/trigger/HttpsDoorSetup.java index f2f8ce9a..f1a65884 100644 --- a/app/src/main/java/com/example/trigger/HttpsDoorSetup.java +++ b/app/src/main/java/com/example/trigger/HttpsDoorSetup.java @@ -121,10 +121,12 @@ public DoorState parseReply(DoorReply reply) { } else { return new DoorState(StateCode.UNKNOWN, msg); } - default: - // should not happen - return new DoorState(StateCode.UNKNOWN, msg); + case DISABLED: + return new DoorState(StateCode.DISABLED, msg); } + + // keep compiler quiet :/ + return null; } @Override diff --git a/app/src/main/java/com/example/trigger/MainActivity.java b/app/src/main/java/com/example/trigger/MainActivity.java index 31851815..8adba1b3 100644 --- a/app/src/main/java/com/example/trigger/MainActivity.java +++ b/app/src/main/java/com/example/trigger/MainActivity.java @@ -51,8 +51,6 @@ public class MainActivity extends AppCompatActivity implements OnTaskCompleted { private ImageButton ringButton; private ImageButton unlockButton; private Spinner spinner; - private WifiTools wifi; - private BluetoothTools bluetooth; private Animation pressed; @@ -101,7 +99,7 @@ private int getPreferredSpinnerIndex(ArrayList items, boolean match int i; // select by ssid - String ssid = wifi.getCurrentSSID(); + String ssid = WifiTools.getCurrentSSID(); if (ssid.length() > 0 && match_ssid) { i = 0; for (SpinnerItem item : items) { @@ -218,8 +216,8 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); Context context = this.getApplicationContext(); - this.wifi = new WifiTools(context); - this.bluetooth = new BluetoothTools(context); + WifiTools.init(context); + BluetoothTools.init(context); Settings.init(context); Resources res = getResources(); @@ -263,38 +261,7 @@ protected void onPause() { BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - Setup current = getSelectedSetup(); - - if (current == null) { - changeUI(StateCode.DISABLED); - } else if (current instanceof BluetoothDoorSetup || current instanceof NukiDoorSetup) { - // assume the current setup uses Bluetooth based! - int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); - - if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { - if (state == BluetoothAdapter.STATE_ON) { - Log.d("MainActivity", "bluetooth turned on"); - changeUI(StateCode.UNKNOWN); - updateSpinner(true); // auto select possible entry - callRequestHandler(Action.fetch_state); - } - if (state == BluetoothAdapter.STATE_OFF) { - Log.d("MainActivity", "bluetooth state unknown => " + state); - changeUI(StateCode.DISABLED); - } - } - } else { - // assume the current setup uses WiFi based! - Log.d("MainActivity", "wifi turned on"); - if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) && wifi.isConnected()) { - updateSpinner(true); // auto select possible entry - callRequestHandler(Action.fetch_state); - } else { - Log.d("MainActivity", "wifi state unknown => disabled"); - changeUI(StateCode.DISABLED); - } - } + callRequestHandler(Action.fetch_state); } }; @@ -414,9 +381,7 @@ private void callRequestHandler(Action action) { protected void onStart() { super.onStart(); - if (wifi.isConnected()) { - callRequestHandler(Action.fetch_state); - } + callRequestHandler(Action.fetch_state); } // Show/Hide menu items diff --git a/app/src/main/java/com/example/trigger/MqttDoorSetup.java b/app/src/main/java/com/example/trigger/MqttDoorSetup.java index 7ef86ead..ec59ecb4 100644 --- a/app/src/main/java/com/example/trigger/MqttDoorSetup.java +++ b/app/src/main/java/com/example/trigger/MqttDoorSetup.java @@ -110,10 +110,12 @@ public DoorState parseReply(DoorReply reply) { } else { return new DoorState(StateCode.UNKNOWN, msg); } - default: - // should not happen - return new DoorState(StateCode.UNKNOWN, msg); + case DISABLED: + return new DoorState(StateCode.DISABLED, msg); } + + // keep compiler quiet :/ + return null; } @Override diff --git a/app/src/main/java/com/example/trigger/NukiDoorSetup.java b/app/src/main/java/com/example/trigger/NukiDoorSetup.java index 7c97fddc..cc2cd2c3 100644 --- a/app/src/main/java/com/example/trigger/NukiDoorSetup.java +++ b/app/src/main/java/com/example/trigger/NukiDoorSetup.java @@ -92,10 +92,12 @@ public DoorState parseReply(DoorReply reply) { } else { return new DoorState(StateCode.UNKNOWN, msg); } - default: - // should not happen - return new DoorState(StateCode.UNKNOWN, msg); + case DISABLED: + return new DoorState(StateCode.DISABLED, msg); } + + // keep compiler quiet :/ + return null; } @Override diff --git a/app/src/main/java/com/example/trigger/SshDoorSetup.java b/app/src/main/java/com/example/trigger/SshDoorSetup.java index 4e0384d9..4aac7b25 100644 --- a/app/src/main/java/com/example/trigger/SshDoorSetup.java +++ b/app/src/main/java/com/example/trigger/SshDoorSetup.java @@ -92,15 +92,26 @@ public String getRegisterUrl() { public DoorState parseReply(DoorReply reply) { String msg = android.text.Html.fromHtml(reply.message).toString().trim(); - if (reply.message.contains("UNLOCKED")) { - // door unlocked - return new DoorState(StateCode.OPEN, msg); - } else if (reply.message.contains("LOCKED")) { - // door locked - return new DoorState(StateCode.CLOSED, msg); - } else { - return new DoorState(StateCode.UNKNOWN, msg); + switch (reply.code) { + case LOCAL_ERROR: + case REMOTE_ERROR: + return new DoorState(StateCode.UNKNOWN, msg); + case SUCCESS: + if (reply.message.contains("UNLOCKED")) { + // door unlocked + return new DoorState(StateCode.OPEN, msg); + } else if (reply.message.contains("LOCKED")) { + // door locked + return new DoorState(StateCode.CLOSED, msg); + } else { + return new DoorState(StateCode.UNKNOWN, msg); + } + case DISABLED: + return new DoorState(StateCode.DISABLED, msg); } + + // keep compiler quiet :/ + return null; } @Override diff --git a/app/src/main/java/com/example/trigger/WifiTools.java b/app/src/main/java/com/example/trigger/WifiTools.java index 9ac06cff..62d7905c 100644 --- a/app/src/main/java/com/example/trigger/WifiTools.java +++ b/app/src/main/java/com/example/trigger/WifiTools.java @@ -11,13 +11,13 @@ public class WifiTools { - private WifiManager wifiManager; + private static WifiManager wifiManager; - WifiTools(Context context) { - this.wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - } + static void init(Context context) { + wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + } - String getCurrentSSID() { + public static String getCurrentSSID() { // From android 8.0 only available if GPS on?! if (wifiManager != null) { WifiInfo info = wifiManager.getConnectionInfo(); @@ -34,11 +34,11 @@ String getCurrentSSID() { } } - ArrayList getScannedSSIDs() { + public static ArrayList getScannedSSIDs() { ArrayList ssids; List results; - ssids = new ArrayList(); + ssids = new ArrayList<>(); if (wifiManager != null) { results = wifiManager.getScanResults(); if (results != null) { @@ -51,11 +51,11 @@ ArrayList getScannedSSIDs() { return ssids; } - ArrayList getConfiguredSSIDs() { + public static ArrayList getConfiguredSSIDs() { List configs; ArrayList ssids; - ssids = new ArrayList(); + ssids = new ArrayList<>(); if (wifiManager != null) { configs = wifiManager.getConfiguredNetworks(); if (configs != null) { @@ -68,7 +68,7 @@ ArrayList getConfiguredSSIDs() { return ssids; } - WifiConfiguration findConfig(List configs, String ssid) { + public static WifiConfiguration findConfig(List configs, String ssid) { for (WifiConfiguration config : configs) { if (config.SSID.equals(ssid)) { return config; @@ -110,7 +110,7 @@ void connectBestOf(ArrayList ssids) { } } */ - boolean isConnected() { + public static boolean isConnected() { if (wifiManager != null && wifiManager.isWifiEnabled()) { // Wi-Fi adapter is ON WifiInfo wifiInfo = wifiManager.getConnectionInfo(); diff --git a/app/src/main/java/com/example/trigger/bluetooth/BluetoothRequestHandler.java b/app/src/main/java/com/example/trigger/bluetooth/BluetoothRequestHandler.java index 52b6c779..0603e2f6 100644 --- a/app/src/main/java/com/example/trigger/bluetooth/BluetoothRequestHandler.java +++ b/app/src/main/java/com/example/trigger/bluetooth/BluetoothRequestHandler.java @@ -36,14 +36,16 @@ public void run() { return; } - BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); - if (bluetooth == null) { - this.listener.onTaskResult(setup.getId(), ReplyCode.LOCAL_ERROR, "Device does not support bluetooth"); + if (adapter == null) { + this.listener.onTaskResult(setup.getId(), ReplyCode.DISABLED, "Device does not support Bluetooth"); return; - } else if (!bluetooth.isEnabled()) { + } + + if (!adapter.isEnabled()) { // request to enable - this.listener.onTaskResult(setup.getId(), ReplyCode.LOCAL_ERROR, "Bluetooth is disabled."); + this.listener.onTaskResult(setup.getId(), ReplyCode.DISABLED, "Bluetooth is disabled."); return; } @@ -71,7 +73,7 @@ public void run() { } try { - Set pairedDevices = bluetooth.getBondedDevices(); + Set pairedDevices = adapter.getBondedDevices(); String address = ""; for (BluetoothDevice device : pairedDevices) { @@ -86,7 +88,7 @@ public void run() { return; } - BluetoothDevice device = bluetooth.getRemoteDevice(address); + BluetoothDevice device = adapter.getRemoteDevice(address); if (setup.service_uuid.isEmpty()) { socket = BluetoothTools.createRfcommSocket(device); diff --git a/app/src/main/java/com/example/trigger/https/HttpsRequestHandler.java b/app/src/main/java/com/example/trigger/https/HttpsRequestHandler.java index 3844ca0b..23102737 100644 --- a/app/src/main/java/com/example/trigger/https/HttpsRequestHandler.java +++ b/app/src/main/java/com/example/trigger/https/HttpsRequestHandler.java @@ -1,5 +1,7 @@ package com.example.trigger.https; +import android.content.Context; + import java.io.FileNotFoundException; import java.net.HttpURLConnection; import java.net.MalformedURLException; @@ -15,6 +17,7 @@ import com.example.trigger.OnTaskCompleted; import com.example.trigger.Utils; import com.example.trigger.Log; +import com.example.trigger.WifiTools; public class HttpsRequestHandler extends Thread { @@ -34,6 +37,11 @@ public void run() { return; } + if (!WifiTools.isConnected()) { + this.listener.onTaskResult(setup.getId(), ReplyCode.DISABLED, "Wifi Disabled."); + return; + } + String command = ""; switch (action) { diff --git a/app/src/main/java/com/example/trigger/mqtt/MqttRequestHandler.java b/app/src/main/java/com/example/trigger/mqtt/MqttRequestHandler.java index 5c27c068..29956485 100644 --- a/app/src/main/java/com/example/trigger/mqtt/MqttRequestHandler.java +++ b/app/src/main/java/com/example/trigger/mqtt/MqttRequestHandler.java @@ -17,6 +17,7 @@ import com.example.trigger.DoorReply.ReplyCode; import com.example.trigger.OnTaskCompleted; import com.example.trigger.Log; +import com.example.trigger.WifiTools; public class MqttRequestHandler extends Thread implements MqttCallback { @@ -36,6 +37,11 @@ public void run() { return; } + if (!WifiTools.isConnected()) { + this.listener.onTaskResult(setup.getId(), ReplyCode.DISABLED, "Wifi Disabled."); + return; + } + switch (action) { case fetch_state: if (setup.status_topic.isEmpty()) { diff --git a/app/src/main/java/com/example/trigger/ssh/SshRequestHandler.java b/app/src/main/java/com/example/trigger/ssh/SshRequestHandler.java index 2a8cf1e4..5ab080e2 100644 --- a/app/src/main/java/com/example/trigger/ssh/SshRequestHandler.java +++ b/app/src/main/java/com/example/trigger/ssh/SshRequestHandler.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.InputStream; +import com.example.trigger.WifiTools; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; @@ -33,6 +34,12 @@ public void run() { this.listener.onTaskResult(setup.getId(), ReplyCode.LOCAL_ERROR, "Internal Error"); return; } + + if (!WifiTools.isConnected()) { + this.listener.onTaskResult(setup.getId(), ReplyCode.DISABLED, "Wifi Disabled."); + return; + } + String command = ""; switch (action) {