diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 73030362eb..9354b769bb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,6 +30,7 @@
+
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java b/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
index 8594424e14..141e4e8d7e 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/GcmActivity.java
@@ -179,7 +179,9 @@ public static void sendBridgeBattery(final int battery) {
private static void sendRealSnoozeToRemote() {
if (JoH.pratelimit("gcm-sra", 60)) {
- sendMessage("sra", Long.toString(JoH.tsl()));
+ String wifi_ssid = JoH.getWifiSSID();
+ if (wifi_ssid == null) wifi_ssid = "";
+ sendMessage("sra", Long.toString(JoH.tsl()) + "^" + JoH.base64encode(wifi_ssid));
}
}
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java b/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
index 523e059b56..04050cd29c 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/GcmListenerSvc.java
@@ -209,17 +209,33 @@ public void onMessageReceived(RemoteMessage rmessage) {
} else if (action.equals("sra")) {
if ((Home.get_follower() || Home.get_master())) {
if (Home.getPreferencesBooleanDefaultFalse("accept_remote_snoozes")) {
- final long snoozed_time = Long.parseLong(payload);
- if (Math.abs(JoH.tsl() - snoozed_time) < 300000) {
- if (JoH.pratelimit("received-remote-snooze", 30)) {
- AlertPlayer.getPlayer().Snooze(xdrip.getAppContext(), -1, false);
- UserError.Log.ueh(TAG, "Accepted remote snooze");
- JoH.static_toast_long("Received remote snooze!");
+ try {
+ long snoozed_time = 0;
+ String sender_ssid = "";
+ try {
+ snoozed_time = Long.parseLong(payload);
+ } catch (NumberFormatException e) {
+ String ii[] = payload.split("\\^");
+ snoozed_time = Long.parseLong(ii[0]);
+ if (ii.length > 1) sender_ssid = JoH.base64decode(ii[1]);
+ }
+ if (!Home.getPreferencesBooleanDefaultFalse("remote_snoozes_wifi_match") || JoH.getWifiFuzzyMatch(sender_ssid,JoH.getWifiSSID())) {
+ if (Math.abs(JoH.tsl() - snoozed_time) < 300000) {
+ if (JoH.pratelimit("received-remote-snooze", 30)) {
+ AlertPlayer.getPlayer().Snooze(xdrip.getAppContext(), -1, false);
+ UserError.Log.ueh(TAG, "Accepted remote snooze");
+ JoH.static_toast_long("Received remote snooze!");
+ } else {
+ Log.e(TAG, "Rate limited remote snooze");
+ }
+ } else {
+ UserError.Log.uel(TAG, "Ignoring snooze as outside 5 minute window, sync lag or clock difference");
+ }
} else {
- Log.e(TAG, "Rate limited remote snooze");
+ UserError.Log.uel(TAG,"Ignoring snooze as wifi network names do not match closely enough");
}
- } else {
- UserError.Log.uel(TAG, "Ignoring snooze as outside 5 minute window, sync lag or clock difference");
+ } catch (Exception e) {
+ UserError.Log.e(TAG, "Exception processing remote snooze: " + e);
}
} else {
UserError.Log.uel(TAG, "Rejecting remote snooze");
diff --git a/app/src/main/java/com/eveningoutpost/dexdrip/Models/JoH.java b/app/src/main/java/com/eveningoutpost/dexdrip/Models/JoH.java
index 5c0759641d..8374bc476a 100644
--- a/app/src/main/java/com/eveningoutpost/dexdrip/Models/JoH.java
+++ b/app/src/main/java/com/eveningoutpost/dexdrip/Models/JoH.java
@@ -17,6 +17,8 @@
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler;
import android.os.PowerManager;
@@ -229,6 +231,15 @@ public static String base64encode(String input) {
}
}
+ public static String base64decode(String input) {
+ try {
+ return new String(Base64.decode(input.getBytes("UTF-8"), Base64.NO_WRAP), "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ Log.e(TAG, "Got unsupported encoding: " + e);
+ return "decode-error";
+ }
+ }
+
public static String ucFirst(String input) {
return input.substring(0, 1).toUpperCase() + input.substring(1).toLowerCase();
}
@@ -483,6 +494,51 @@ public static boolean isOngoingCall() {
}
}
+ public static String getWifiSSID() {
+ try {
+ final WifiManager wifi_manager = (WifiManager) xdrip.getAppContext().getSystemService(Context.WIFI_SERVICE);
+ if (wifi_manager.isWifiEnabled()) {
+ final WifiInfo wifiInfo = wifi_manager.getConnectionInfo();
+ if (wifiInfo != null) {
+ final NetworkInfo.DetailedState wifi_state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
+ if (wifi_state == NetworkInfo.DetailedState.CONNECTED
+ || wifi_state == NetworkInfo.DetailedState.OBTAINING_IPADDR
+ || wifi_state == NetworkInfo.DetailedState.CAPTIVE_PORTAL_CHECK) {
+ String ssid = wifiInfo.getSSID();
+ if (ssid.equals("")) return null; // WifiSsid.NONE;
+ if (ssid.charAt(0)=='"') ssid=ssid.substring(1);
+ if (ssid.charAt(ssid.length()-1)=='"') ssid=ssid.substring(0,ssid.length()-1);
+ return ssid;
+ }
+ }
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Got exception in getWifiSSID: " + e);
+ }
+ return null;
+ }
+
+ public static boolean getWifiFuzzyMatch(String local, String remote) {
+ if ((local == null) || (remote == null) || (local.length() == 0) || (remote.length() == 0))
+ return false;
+ final int slen = Math.min(local.length(), remote.length());
+ final int llen = Math.max(local.length(), remote.length());
+ int matched = 0;
+ for (int i = 0; i < slen; i++) {
+ if (local.charAt(i) == (remote.charAt(i))) matched++;
+ }
+ boolean result = false;
+ if (matched == slen) result = true; // shorter string is substring
+ final double quota = (double) matched / (double) llen;
+ final int dmatch = llen - matched;
+ if (slen > 2) {
+ if (dmatch < 3) result = true;
+ if (quota > 0.80) result = true;
+ }
+ //Log.d(TAG, "l:" + local + " r:" + remote + " slen:" + slen + " llen:" + llen + " matched:" + matched + " q:" + JoH.qs(quota, 2) + " dm:" + dmatch + " RESULT: " + result);
+ return result;
+ }
+
public static boolean runOnUiThread(Runnable theRunnable) {
final Handler mainHandler = new Handler(xdrip.getAppContext().getMainLooper());
return mainHandler.post(theRunnable);
diff --git a/app/src/main/res/xml/xdrip_plus_prefs.xml b/app/src/main/res/xml/xdrip_plus_prefs.xml
index 841ade62fc..09fc3b0e8e 100644
--- a/app/src/main/res/xml/xdrip_plus_prefs.xml
+++ b/app/src/main/res/xml/xdrip_plus_prefs.xml
@@ -3,7 +3,7 @@
+ android:title="@string/xdrip_plus_extra_settings" />
-
+ android:switchTextOff="@string/short_off_text_for_switches"
+ android:switchTextOn="@string/short_on_text_for_switches"
+ android:title="Force English Text">
+ android:key="forced_language"
+ android:summary="If you need an alternate language translation within xDrip+"
+ android:title="Choose a specific language" />
+ android:title="Widget Range Lines" />
@@ -318,7 +317,7 @@
+ android:targetPackage="@string/local_target_package" />
+ android:targetPackage="@string/local_target_package" />
-
-
-
+
+
+
+
-
@@ -520,12 +525,12 @@
android:summary="@string/automatic_updates_crash_reports_and_feedback"
android:title="@string/xdrip_plus_update_settings">