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">