Reorganized settings, added options to set vpn4, vpn6 & dns address

This commit is contained in:
M66B 2016-01-27 08:37:45 +01:00
parent 28cafaa21d
commit 79674c6535
4 changed files with 208 additions and 124 deletions

View File

@ -68,6 +68,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@ -111,23 +112,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
PreferenceScreen screen = getPreferenceScreen();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// Wi-Fi home
MultiSelectListPreference pref_wifi_homes = (MultiSelectListPreference) screen.findPreference("wifi_homes");
Set<String> ssid = prefs.getStringSet("wifi_homes", new HashSet<String>());
if (ssid.size() > 0)
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid)));
else
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, "-"));
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
List<CharSequence> listSSID = new ArrayList<>();
List<WifiConfiguration> configs = wm.getConfiguredNetworks();
if (configs != null)
for (WifiConfiguration config : configs)
listSSID.add(config.SSID == null ? "NULL" : config.SSID);
pref_wifi_homes.setEntries(listSSID.toArray(new CharSequence[0]));
pref_wifi_homes.setEntryValues(listSSID.toArray(new CharSequence[0]));
// Handle auto enable
Preference pref_auto_enable = screen.findPreference("auto_enable");
pref_auto_enable.setTitle(getString(R.string.setting_auto, prefs.getString("auto_enable", "0")));
@ -147,6 +131,31 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
break;
}
// Wi-Fi home
MultiSelectListPreference pref_wifi_homes = (MultiSelectListPreference) screen.findPreference("wifi_homes");
Set<String> ssid = prefs.getStringSet("wifi_homes", new HashSet<String>());
if (ssid.size() > 0)
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid)));
else
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, "-"));
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
List<CharSequence> listSSID = new ArrayList<>();
List<WifiConfiguration> configs = wm.getConfiguredNetworks();
if (configs != null)
for (WifiConfiguration config : configs)
listSSID.add(config.SSID == null ? "NULL" : config.SSID);
pref_wifi_homes.setEntries(listSSID.toArray(new CharSequence[0]));
pref_wifi_homes.setEntryValues(listSSID.toArray(new CharSequence[0]));
// VPN parameters
screen.findPreference("vpn4").setTitle(getString(R.string.setting_vpn4, prefs.getString("vpn4", "10.1.10.1")));
screen.findPreference("vpn6").setTitle(getString(R.string.setting_vpn4, prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1")));
EditTextPreference pref_dns = (EditTextPreference) screen.findPreference("dns");
String def_dns = Util.getDefaultDNS(this);
pref_dns.getEditText().setHint(def_dns);
pref_dns.setTitle(getString(R.string.setting_dns, prefs.getString("dns", def_dns)));
// Handle stats
EditTextPreference pref_stats_base = (EditTextPreference) screen.findPreference("stats_base");
EditTextPreference pref_stats_frequency = (EditTextPreference) screen.findPreference("stats_frequency");
@ -177,7 +186,7 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
}
});
// Handle hosts
// Handle hosts import
Preference pref_hosts = screen.findPreference("hosts");
Preference pref_block_domains = screen.findPreference("use_hosts");
pref_block_domains.setEnabled(new File(getFilesDir(), "hosts.txt").exists());
@ -199,8 +208,14 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
});
}
EditTextPreference pref_dns = (EditTextPreference) screen.findPreference("dns");
pref_dns.getEditText().setHint(Util.getDefaultDNS(this));
// Development
if (!(Util.isDebuggable(this) || Util.getSelfVersionName(this).contains("beta"))) {
screen.removePreference(screen.findPreference("category_development"));
SharedPreferences.Editor edit = prefs.edit();
edit.remove("debug");
edit.remove("loglevel");
edit.apply();
}
// Handle technical info
Preference.OnPreferenceClickListener listener = new Preference.OnPreferenceClickListener() {
@ -248,15 +263,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
options.removePreference(screen.findPreference("unmetered_4g"));
options.removePreference(screen.findPreference("national_roaming"));
}
if (!(Util.isDebuggable(this) || Util.getSelfVersionName(this).contains("beta"))) {
screen.removePreference(screen.findPreference("category_development"));
SharedPreferences.Editor edit = prefs.edit();
edit.remove("debug");
edit.remove("loglevel");
edit.remove("dns");
edit.apply();
}
}
@Override
@ -347,6 +353,7 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
}
}
// Dependencies
if ("whitelist_wifi".equals(name) ||
"screen_wifi".equals(name))
SinkholeService.reload("wifi", "changed " + name, this);
@ -364,6 +371,51 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
} else
SinkholeService.reload("other", "changed " + name, this);
} else if ("auto_enable".equals(name))
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_auto, prefs.getString(name, "0")));
else if ("screen_delay".equals(name))
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_delay, prefs.getString(name, "0")));
else if ("theme".equals(name) || "dark_theme".equals(name))
recreate();
else if ("tethering".equals(name))
SinkholeService.reload(null, "changed " + name, this);
else if ("wifi_homes".equals(name)) {
MultiSelectListPreference pref_wifi_homes = (MultiSelectListPreference) getPreferenceScreen().findPreference(name);
Set<String> ssid = prefs.getStringSet(name, new HashSet<String>());
if (ssid.size() > 0)
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid)));
else
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, "-"));
SinkholeService.reload(null, "changed " + name, this);
} else if ("use_metered".equals(name))
SinkholeService.reload(null, "changed " + name, this);
else if ("unmetered_2g".equals(name) ||
"unmetered_3g".equals(name) ||
"unmetered_4g".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED);
} else
SinkholeService.reload("other", "changed " + name, this);
} else if ("national_roaming".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_NATIONAL);
} else
SinkholeService.reload("other", "changed " + name, this);
} else if ("manage_system".equals(name)) {
boolean manage = prefs.getBoolean(name, false);
if (!manage)
@ -371,8 +423,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
prefs.edit().putBoolean("show_system", manage).apply();
SinkholeService.reload(null, "changed " + name, this);
} else if ("tethering".equals(name)) {
SinkholeService.reload(null, "changed " + name, this);
} else if ("log".equals(name)) {
if (prefs.getBoolean(name, false) && !IAB.isPurchased(ActivityPro.SKU_LOG, this)) {
@ -406,46 +456,44 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
} else if ("use_hosts".equals(name))
SinkholeService.reload(null, "changed " + name, this);
else if ("auto_enable".equals(name))
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_auto, prefs.getString(name, "0")));
else if ("vpn4".equals(name)) {
String vpn4 = prefs.getString("vpn4", null);
try {
if (TextUtils.isEmpty(vpn4.trim()))
throw new IllegalArgumentException("vpn4");
InetAddress.getByName(vpn4);
SinkholeService.reload(null, "changed " + name, this);
} catch (Throwable ex) {
Log.w(TAG, ex.toString());
prefs.edit().remove("vpn4").apply();
}
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_vpn4, prefs.getString("vpn4", "10.1.10.1")));
else if ("screen_delay".equals(name))
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_delay, prefs.getString(name, "0")));
} else if ("vpn6".equals(name)) {
String vpn6 = prefs.getString("vpn6", null);
try {
if (TextUtils.isEmpty(vpn6.trim()))
throw new IllegalArgumentException("vpn6");
InetAddress.getByName(vpn6);
SinkholeService.reload(null, "changed " + name, this);
} catch (Throwable ex) {
Log.w(TAG, ex.toString());
prefs.edit().remove("vpn6").apply();
}
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_vpn6, prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1")));
else if ("theme".equals(name) || "dark_theme".equals(name)) {
recreate();
} else if ("wifi_homes".equals(name)) {
MultiSelectListPreference pref_wifi_homes = (MultiSelectListPreference) getPreferenceScreen().findPreference(name);
Set<String> ssid = prefs.getStringSet(name, new HashSet<String>());
if (ssid.size() > 0)
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, TextUtils.join(", ", ssid)));
else
pref_wifi_homes.setTitle(getString(R.string.setting_wifi_home, "-"));
SinkholeService.reload(null, "changed " + name, this);
} else if ("use_metered".equals(name))
SinkholeService.reload(null, "changed " + name, this);
else if ("unmetered_2g".equals(name) ||
"unmetered_3g".equals(name) ||
"unmetered_4g".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED);
} else
SinkholeService.reload("other", "changed " + name, this);
} else if ("national_roaming".equals(name)) {
if (prefs.getBoolean(name, false)) {
if (Util.hasPhoneStatePermission(this))
SinkholeService.reload("other", "changed " + name, this);
else
requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_NATIONAL);
} else
SinkholeService.reload("other", "changed " + name, this);
} else if ("dns".equals(name)) {
String dns = prefs.getString("dns", null);
try {
if (TextUtils.isEmpty(dns.trim()))
throw new IllegalArgumentException("dns");
InetAddress.getByName(dns);
SinkholeService.reload(null, "changed " + name, this);
} catch (Throwable ex) {
Log.w(TAG, ex.toString());
prefs.edit().remove("dns").apply();
}
getPreferenceScreen().findPreference(name).setTitle(getString(R.string.setting_dns, prefs.getString("dns", Util.getDefaultDNS(this))));
} else if ("show_stats".equals(name)) {
SinkholeService.reloadStats("changed " + name, this);
@ -461,11 +509,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere
} else if ("debug".equals(name) || "loglevel".equals(name))
SinkholeService.reload(null, "changed " + name, this);
else if ("dns".equals(name)) {
if (prefs.getBoolean("filter", false))
SinkholeService.reload(null, "changed " + name, this);
}
}
@Override

View File

@ -82,6 +82,8 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
private boolean last_connected = false;
private boolean last_metered = true;
private boolean last_interactive = false;
private String last_vpn4 = null;
private String last_vpn6 = null;
private String last_dns = null;
private boolean last_tethering = false;
private boolean phone_state = false;
@ -339,6 +341,9 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SinkholeService.this);
boolean tethering = prefs.getBoolean("tethering", false);
boolean filter = prefs.getBoolean("filter", false);
String vpn4 = prefs.getString("vpn4", "10.1.10.1");
String vpn6 = prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1");
String dns = getDns();
if (state != State.enforcing) {
if (state != State.none) {
@ -355,7 +360,9 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
if (filter &&
tethering == last_tethering &&
getDns().equals(last_dns)) {
vpn4.equals(last_vpn4) &&
vpn6.equals(last_vpn6) &&
dns.equals(last_dns)) {
Log.i(TAG, "Native restart");
if (vpn != null)
@ -667,18 +674,16 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
Log.i(TAG, "DNS system=" + sysDns + " VPN=" + vpnDns);
try {
if (TextUtils.isEmpty(vpnDns.trim()))
throw new IllegalArgumentException();
throw new IllegalArgumentException("dns");
InetAddress.getByName(vpnDns);
Log.i(TAG, "DNS using=" + vpnDns);
return vpnDns;
} catch (Throwable ex) {
Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex));
} catch (Throwable ignored1) {
try {
InetAddress.getByName(sysDns);
Log.i(TAG, "DNS using=" + sysDns);
return sysDns;
} catch (Throwable exex) {
Log.e(TAG, exex.toString() + "\n" + Log.getStackTraceString(exex));
} catch (Throwable ignored2) {
Log.i(TAG, "DNS using=8.8.8.8");
return "8.8.8.8";
}
@ -690,14 +695,19 @@ public class SinkholeService extends VpnService implements SharedPreferences.OnS
boolean tethering = prefs.getBoolean("tethering", false);
boolean filter = prefs.getBoolean("filter", false);
last_vpn4 = prefs.getString("vpn4", "10.1.10.1");
last_vpn6 = prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1");
last_dns = getDns();
last_tethering = tethering;
// Build VPN service
final Builder builder = new Builder();
builder.setSession(getString(R.string.app_name) + " session");
builder.addAddress(prefs.getString("vpn4", "10.1.10.1"), 32);
builder.addAddress(prefs.getString("vpn6", "fd00:1:fd00:1:fd00:1:fd00:1"), 64);
// VPN address
Log.i(TAG, "vpn4=" + last_vpn4 + " vpn6=" + last_vpn6);
builder.addAddress(last_vpn4, 32);
builder.addAddress(last_vpn6, 64);
if (filter)
builder.addDnsServer(last_dns);

View File

@ -39,16 +39,13 @@ These issues are caused by bugs in Android, or in the software provided by the m
<string name="setting_whitelist_roaming">Block roaming</string>
<string name="setting_options">Options</string>
<string name="setting_system">Manage system applications</string>
<string name="setting_tethering">Allow tethering</string>
<string name="setting_log">Log traffic</string>
<string name="setting_filter">Filter traffic</string>
<string name="setting_block_domains">Block domain names</string>
<string name="setting_auto">Auto enable after %1$s minutes</string>
<string name="setting_delay">Delay screen off %1$s minutes</string>
<string name="setting_theme">Theme: %1$s</string>
<string name="setting_dark">Use dark theme</string>
<string name="setting_network_options">Network options</string>
<string name="setting_tethering">Allow tethering</string>
<string name="setting_wifi_home">Wi-Fi home networks: %1$s</string>
<string name="setting_metered">Handle metered Wi-Fi networks</string>
<string name="setting_metered_2g">Consider 2G unmetered</string>
@ -56,6 +53,15 @@ These issues are caused by bugs in Android, or in the software provided by the m
<string name="setting_metered_4g">Consider LTE unmetered</string>
<string name="setting_national_roaming">Ignore national roaming</string>
<string name="setting_advanced_options">Advanced options</string>
<string name="setting_system">Manage system applications</string>
<string name="setting_log">Log traffic</string>
<string name="setting_filter">Filter traffic</string>
<string name="setting_block_domains">Block domain names</string>
<string name="setting_vpn4">VPN IPv4: %s</string>
<string name="setting_vpn6">VPN IPv6: %s</string>
<string name="setting_dns">VPN DNS: %s</string>
<string name="setting_stats_category">Speed notification</string>
<string name="setting_stats">Show speed notification</string>
<string name="setting_stats_top">Show top applications</string>
@ -70,13 +76,9 @@ These issues are caused by bugs in Android, or in the software provided by the m
<string name="setting_technical">Technical information</string>
<string name="summary_system">Define rules for system applications (for experts)</string>
<string name="summary_log">Log addresses of IP packets going into the VPN sinkhole. This might result in extra battery usage.</string>
<string name="summary_filter">Filter IP packets going out of the VPN sinkhole. This might result in extra battery usage.</string>
<string name="summary_block_domains">Redirect blocked domain names to local device. This switch is disabled when no hosts file has been imported.</string>
<string name="summary_stats">Show network speed graph in status bar notification</string>
<string name="summary_auto">After disabling using the widget, automatically enable NetGuard again after the selected number of minutes (enter zero to disable this option)</string>
<string name="summary_delay">After turning the screen off, keep screen on rules active for the selected number of minutes (enter zero to disable this option)</string>
<string name="summary_wifi_home">Apply Wi-Fi network rules for selected network only (apply mobile network rules for other Wi-Fi networks)</string>
<string name="summary_metered">Apply mobile network rules to metered (paid, tethered) Wi-Fi networks</string>
<string name="summary_metered_2g">Apply Wi-Fi network rules for 2G data connections</string>
@ -84,6 +86,13 @@ These issues are caused by bugs in Android, or in the software provided by the m
<string name="summary_metered_4g">Apply Wi-Fi network rules for LTE data connections</string>
<string name="summary_national_roaming">Do not apply roaming rules when the SIM and mobile network country are the same</string>
<string name="summary_system">Define rules for system applications (for experts)</string>
<string name="summary_log">Log addresses of IP packets going into the VPN sinkhole. This might result in extra battery usage.</string>
<string name="summary_filter">Filter IP packets going out of the VPN sinkhole. This might result in extra battery usage.</string>
<string name="summary_block_domains">Redirect blocked domain names to local device. This switch is disabled when no hosts file has been imported.</string>
<string name="summary_stats">Show network speed graph in status bar notification</string>
<string-array name="default_wifi_home" />
<string name="msg_sure">Are you sure?</string>

View File

@ -24,34 +24,10 @@
android:key="whitelist_roaming"
android:title="@string/setting_whitelist_roaming" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_options"
android:title="@string/setting_options">
<SwitchPreference
android:defaultValue="false"
android:key="manage_system"
android:summary="@string/summary_system"
android:title="@string/setting_system" />
<SwitchPreference
android:defaultValue="false"
android:key="tethering"
android:title="@string/setting_tethering" />
<SwitchPreference
android:defaultValue="false"
android:key="log"
android:summary="@string/summary_log"
android:title="@string/setting_log" />
<SwitchPreference
android:defaultValue="false"
android:key="filter"
android:summary="@string/summary_filter"
android:title="@string/setting_filter" />
<SwitchPreference
android:defaultValue="true"
android:dependency="filter"
android:key="use_hosts"
android:summary="@string/summary_block_domains"
android:title="@string/setting_block_domains" />
<EditTextPreference
android:defaultValue="0"
android:inputType="number"
@ -71,6 +47,15 @@
android:defaultValue="false"
android:key="dark_theme"
android:title="@string/setting_dark" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_options"
android:title="@string/setting_network_options">
<SwitchPreference
android:defaultValue="true"
android:key="tethering"
android:title="@string/setting_tethering" />
<MultiSelectListPreference
android:defaultValue="@array/default_wifi_home"
android:key="wifi_homes"
@ -101,6 +86,46 @@
android:summary="@string/summary_national_roaming"
android:title="@string/setting_national_roaming" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_options"
android:title="@string/setting_advanced_options">
<SwitchPreference
android:defaultValue="false"
android:key="manage_system"
android:summary="@string/summary_system"
android:title="@string/setting_system" />
<SwitchPreference
android:defaultValue="false"
android:key="log"
android:summary="@string/summary_log"
android:title="@string/setting_log" />
<SwitchPreference
android:defaultValue="false"
android:key="filter"
android:summary="@string/summary_filter"
android:title="@string/setting_filter" />
<SwitchPreference
android:defaultValue="true"
android:dependency="filter"
android:key="use_hosts"
android:summary="@string/summary_block_domains"
android:title="@string/setting_block_domains" />
<EditTextPreference
inputType="phone"
android:hint="10.1.10.1"
android:inputType="phone"
android:key="vpn4" />
<EditTextPreference
android:hint="fd00:1:fd00:1:fd00:1:fd00:1"
android:inputType="text"
android:key="vpn6" />
<EditTextPreference
android:dependency="filter"
android:inputType="text"
android:key="dns" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_stats"
android:title="@string/setting_stats_category">
@ -130,6 +155,7 @@
android:inputType="number"
android:key="stats_samples" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_backup"
android:title="@string/setting_backup">
@ -144,6 +170,7 @@
android:key="hosts"
android:title="@string/setting_hosts" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_development"
android:title="Development">
@ -158,13 +185,8 @@
android:entryValues="@array/logLevelValues"
android:key="loglevel"
android:title="Native log level" />
<EditTextPreference
android:defaultValue=""
android:dependency="filter"
android:inputType="text"
android:key="dns"
android:title="DNS" />
</PreferenceCategory>
<PreferenceCategory
android:key="category_technical"
android:title="@string/setting_technical">