From 1121680add4cf663af45c0d9677b0c0323cac84a Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 10 Dec 2015 08:38:45 +0100 Subject: [PATCH] Multiple Wi-Fi homes Closes #192 --- .../faircode/netguard/ActivitySettings.java | 49 ++++++++++++------- .../eu/faircode/netguard/SinkholeService.java | 6 ++- app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 5 +- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java index f09e2e51..36c1ca11 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java +++ b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java @@ -34,7 +34,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.EditTextPreference; -import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; @@ -45,6 +45,7 @@ import android.support.v7.app.AppCompatActivity; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.util.Log; import android.util.Xml; import android.widget.Toast; @@ -62,8 +63,10 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; @@ -105,11 +108,9 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere pref_stats_base.setTitle(getString(R.string.setting_stats_base, prefs.getString("stats_base", "5"))); // Wi-Fi home - ListPreference wifi_home_pref = (ListPreference) screen.findPreference("wifi_home"); - String ssid = prefs.getString("wifi_home", ""); - if ("".equals(ssid)) - ssid = getString(R.string.title_all); - wifi_home_pref.setTitle(getString(R.string.setting_wifi_home, ssid)); + MultiSelectListPreference wifi_homes_pref = (MultiSelectListPreference) screen.findPreference("wifi_homes"); + Set ssid = prefs.getStringSet("wifi_homes", new HashSet()); + wifi_homes_pref.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid))); WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); List listSSID = new ArrayList<>(); @@ -117,11 +118,8 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere if (configs != null) for (WifiConfiguration config : configs) listSSID.add(config.SSID); - listSSID.add(0, getString(R.string.title_all)); - wifi_home_pref.setEntries(listSSID.toArray(new CharSequence[0])); - listSSID.remove(0); - listSSID.add(0, ""); - wifi_home_pref.setEntryValues(listSSID.toArray(new CharSequence[0])); + wifi_homes_pref.setEntries(listSSID.toArray(new CharSequence[0])); + wifi_homes_pref.setEntryValues(listSSID.toArray(new CharSequence[0])); // Handle auto enable Preference pref_auto_enable = screen.findPreference("auto_enable"); @@ -177,7 +175,7 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere defaults.removePreference(screen.findPreference("screen_wifi")); PreferenceCategory options = (PreferenceCategory) screen.findPreference("category_options"); - options.removePreference(screen.findPreference("wifi_home")); + options.removePreference(screen.findPreference("wifi_homes")); options.removePreference(screen.findPreference("use_metered")); } @@ -294,12 +292,10 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere else if ("auto_enable".equals(name)) getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_auto, prefs.getString(name, "0"))); - else if ("wifi_home".equals(name)) { - ListPreference pref_wifi_home = (ListPreference) getPreferenceScreen().findPreference(name); - String ssid = prefs.getString(name, ""); - if ("".equals(ssid)) - ssid = getString(R.string.title_all); - pref_wifi_home.setTitle(getString(R.string.setting_wifi_home, ssid)); + else if ("wifi_homes".equals(name)) { + MultiSelectListPreference pref_wifi_homes = (MultiSelectListPreference) getPreferenceScreen().findPreference(name); + Set ssid = prefs.getStringSet(name, new HashSet()); + pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid))); SinkholeService.reload(null, "setting changed", this); } else if ("unmetered_2g".equals(name) || @@ -567,6 +563,14 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere serializer.attribute(null, "value", value.toString()); serializer.endTag(null, "setting"); + } else if (value instanceof Set) { + Set set = (Set) value; + serializer.startTag(null, "setting"); + serializer.attribute(null, "key", key); + serializer.attribute(null, "type", "set"); + serializer.attribute(null, "value", TextUtils.join("\n", set)); + serializer.endTag(null, "setting"); + } else Log.e(TAG, "Unknown key=" + key); } @@ -614,6 +618,8 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere editor.putInt(key, (Integer) value); else if (value instanceof String) editor.putString(key, (String) value); + else if (value instanceof Set) + editor.putStringSet(key, (Set) value); else Log.e(TAG, "Unknown type=" + value.getClass()); } @@ -675,7 +681,12 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere current.put(key, Integer.parseInt(value)); else if ("string".equals(type)) current.put(key, value); - else + else if ("set".equals(type)) { + Set set = new HashSet<>(); + for (String s : ((String) value).split("\n")) + set.add(s); + current.put(key, set); + } else Log.e(TAG, "Unknown type key=" + key); } } diff --git a/app/src/main/java/eu/faircode/netguard/SinkholeService.java b/app/src/main/java/eu/faircode/netguard/SinkholeService.java index f4e05b00..efa7e255 100644 --- a/app/src/main/java/eu/faircode/netguard/SinkholeService.java +++ b/app/src/main/java/eu/faircode/netguard/SinkholeService.java @@ -63,7 +63,9 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class SinkholeService extends VpnService { private static final String TAG = "NetGuard.Service"; @@ -405,7 +407,7 @@ public class SinkholeService extends VpnService { boolean wifi = Util.isWifiActive(this); boolean metered = Util.isMeteredNetwork(this); boolean useMetered = prefs.getBoolean("use_metered", false); - String ssidHome = prefs.getString("wifi_home", ""); + Set ssidHomes = prefs.getStringSet("wifi_homes", new HashSet()); String ssidNetwork = Util.getWifiSSID(this); String generation = Util.getNetworkGeneration(this); boolean unmetered_2g = prefs.getBoolean("unmetered_2g", false); @@ -422,7 +424,7 @@ public class SinkholeService extends VpnService { // Update metered state if (wifi && (!useMetered || !telephony)) metered = false; - if (wifi && !ssidHome.equals("") && !ssidHome.equals(ssidNetwork)) + if (wifi && ssidHomes.size() > 0 && !ssidHomes.contains(ssidNetwork)) metered = true; if (unmetered_2g && "2G".equals(generation)) metered = false; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index afa4be85..fa25fc25 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,6 +51,8 @@ These issues are caused by bugs in Android, or in the software provided by the m Apply Wi-Fi network rules for LTE data connections Do not apply roaming rules when the SIM and mobile network country are the same + + Are you sure? Enforcing rules %1$d allowed, %2$d blocked diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 9ab36952..f911a82e 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -50,8 +50,9 @@ android:defaultValue="false" android:key="dark_theme" android:title="@string/setting_dark" /> -