diff --git a/app/src/main/java/eu/faircode/netguard/ActivityMain.java b/app/src/main/java/eu/faircode/netguard/ActivityMain.java index c2e0e6b2..7e11334c 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivityMain.java +++ b/app/src/main/java/eu/faircode/netguard/ActivityMain.java @@ -553,6 +553,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences swEnabled.setChecked(enabled); } else if ("whitelist_wifi".equals(name) || + "screen_on".equals(name) || "screen_wifi".equals(name) || "whitelist_other".equals(name) || "screen_other".equals(name) || @@ -566,10 +567,11 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences updateApplicationList(null); final LinearLayout llWhitelist = (LinearLayout) findViewById(R.id.llWhitelist); + boolean screen_on = prefs.getBoolean("screen_on", true); boolean whitelist_wifi = prefs.getBoolean("whitelist_wifi", false); boolean whitelist_other = prefs.getBoolean("whitelist_other", false); boolean hintWhitelist = prefs.getBoolean("hint_whitelist", true); - llWhitelist.setVisibility(!(whitelist_wifi || whitelist_other) && hintWhitelist ? View.VISIBLE : View.GONE); + llWhitelist.setVisibility(!(whitelist_wifi || whitelist_other) && screen_on && hintWhitelist ? View.VISIBLE : View.GONE); } else if ("manage_system".equals(name)) { invalidateOptionsMenu(); diff --git a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java index cb21b356..f1724333 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java +++ b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java @@ -497,7 +497,10 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere prefs.edit().remove(name).apply(); // Dependencies - if ("whitelist_wifi".equals(name) || + if ("screen_on".equals(name)) + ServiceSinkhole.reload("changed " + name, this); + + else if ("whitelist_wifi".equals(name) || "screen_wifi".equals(name)) ServiceSinkhole.reload("changed " + name, this); diff --git a/app/src/main/java/eu/faircode/netguard/AdapterRule.java b/app/src/main/java/eu/faircode/netguard/AdapterRule.java index 0a4504a9..0810a610 100644 --- a/app/src/main/java/eu/faircode/netguard/AdapterRule.java +++ b/app/src/main/java/eu/faircode/netguard/AdapterRule.java @@ -337,6 +337,8 @@ public class AdapterRule extends RecyclerView.Adapter im } }.execute(); + boolean screen_on = prefs.getBoolean("screen_on", true); + // Wi-Fi settings holder.cbWifi.setEnabled(rule.apply); holder.cbWifi.setAlpha(wifiActive ? 1 : 0.5f); @@ -356,7 +358,7 @@ public class AdapterRule extends RecyclerView.Adapter im holder.ivScreenWifi.setEnabled(rule.apply); holder.ivScreenWifi.setAlpha(wifiActive ? 1 : 0.5f); - holder.ivScreenWifi.setVisibility(rule.screen_wifi && rule.wifi_blocked ? View.VISIBLE : View.INVISIBLE); + holder.ivScreenWifi.setVisibility(rule.screen_wifi && rule.wifi_blocked && screen_on ? View.VISIBLE : View.INVISIBLE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Drawable wrap = DrawableCompat.wrap(holder.ivScreenWifi.getDrawable()); DrawableCompat.setTint(wrap, rule.apply ? colorOn : colorGrayed); @@ -381,7 +383,7 @@ public class AdapterRule extends RecyclerView.Adapter im holder.ivScreenOther.setEnabled(rule.apply); holder.ivScreenOther.setAlpha(otherActive ? 1 : 0.5f); - holder.ivScreenOther.setVisibility(rule.screen_other && rule.other_blocked ? View.VISIBLE : View.INVISIBLE); + holder.ivScreenOther.setVisibility(rule.screen_other && rule.other_blocked && screen_on ? View.VISIBLE : View.INVISIBLE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Drawable wrap = DrawableCompat.wrap(holder.ivScreenOther.getDrawable()); DrawableCompat.setTint(wrap, rule.apply ? colorOn : colorGrayed); diff --git a/app/src/main/java/eu/faircode/netguard/Rule.java b/app/src/main/java/eu/faircode/netguard/Rule.java index a1b74ffb..7dfde4a1 100644 --- a/app/src/main/java/eu/faircode/netguard/Rule.java +++ b/app/src/main/java/eu/faircode/netguard/Rule.java @@ -275,12 +275,17 @@ public class Rule { boolean default_screen_wifi = prefs.getBoolean("screen_wifi", true); boolean default_screen_other = prefs.getBoolean("screen_other", true); boolean default_roaming = prefs.getBoolean("whitelist_roaming", true); + boolean manage_system = prefs.getBoolean("manage_system", false); + boolean screen_on = prefs.getBoolean("screen_on", true); boolean show_user = prefs.getBoolean("show_user", true); boolean show_system = prefs.getBoolean("show_system", false); boolean show_nointernet = prefs.getBoolean("show_nointernet", true); boolean show_disabled = prefs.getBoolean("show_disabled", true); + default_screen_wifi = default_screen_wifi && screen_on; + default_screen_other = default_screen_other && screen_on; + long now = SystemClock.elapsedRealtime(); // Get predefined rules @@ -380,8 +385,8 @@ public class Rule { rule.wifi_blocked = (!(rule.system && !manage_system) && wifi.getBoolean(info.packageName, rule.wifi_default)); rule.other_blocked = (!(rule.system && !manage_system) && other.getBoolean(info.packageName, rule.other_default)); - rule.screen_wifi = screen_wifi.getBoolean(info.packageName, rule.screen_wifi_default); - rule.screen_other = screen_other.getBoolean(info.packageName, rule.screen_other_default); + rule.screen_wifi = screen_wifi.getBoolean(info.packageName, rule.screen_wifi_default) && screen_on; + rule.screen_other = screen_other.getBoolean(info.packageName, rule.screen_other_default) && screen_on; rule.roaming = roaming.getBoolean(info.packageName, rule.roaming_default); rule.apply = apply.getBoolean(info.packageName, true); @@ -477,8 +482,9 @@ public class Rule { public void updateChanged(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - boolean default_wifi = prefs.getBoolean("whitelist_wifi", true); - boolean default_other = prefs.getBoolean("whitelist_other", true); + boolean screen_on = prefs.getBoolean("screen_on", false); + boolean default_wifi = prefs.getBoolean("whitelist_wifi", true) && screen_on; + boolean default_other = prefs.getBoolean("whitelist_other", true) && screen_on; boolean default_roaming = prefs.getBoolean("whitelist_roaming", true); updateChanged(default_wifi, default_other, default_roaming); } diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index 9bcb596c..df048a20 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -282,6 +282,25 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS return; } + if (prefs.getBoolean("screen_on", true)) { + Log.i(TAG, "Started listening for interactive state changes"); + if (prefs.getBoolean("screen_on", true)) { + last_interactive = Util.isInteractive(ServiceSinkhole.this); + IntentFilter ifInteractive = new IntentFilter(); + ifInteractive.addAction(Intent.ACTION_SCREEN_ON); + ifInteractive.addAction(Intent.ACTION_SCREEN_OFF); + ifInteractive.addAction(ACTION_SCREEN_OFF_DELAYED); + registerReceiver(interactiveStateReceiver, ifInteractive); + registeredInteractiveState = true; + } + } else { + Log.i(TAG, "Stopped listening for interactive state changes"); + if (registeredInteractiveState) { + unregisterReceiver(interactiveStateReceiver); + registeredInteractiveState = false; + } + } + // Listen for phone state changes TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (tm != null && !phone_state && @@ -1798,15 +1817,6 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS logHandler = new LogHandler(logLooper); statsHandler = new StatsHandler(statsLooper); - // Listen for interactive state changes - last_interactive = Util.isInteractive(this); - IntentFilter ifInteractive = new IntentFilter(); - ifInteractive.addAction(Intent.ACTION_SCREEN_ON); - ifInteractive.addAction(Intent.ACTION_SCREEN_OFF); - ifInteractive.addAction(ACTION_SCREEN_OFF_DELAYED); - registerReceiver(interactiveStateReceiver, ifInteractive); - registeredInteractiveState = true; - // Listen for power save mode if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !Util.isPlayStoreInstall(this)) { PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd1404c2..e39174cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,6 +65,7 @@ however it is impossible to guarantee NetGuard will work correctly on every devi Theme: %1$s Use dark theme Notify on new install + Apply \'when screen on\' rules Auto enable after %1$s minutes Delay screen off %1$s minutes Check for updates diff --git a/app/src/main/res/xml-v14/preferences.xml b/app/src/main/res/xml-v14/preferences.xml index e5d9fc44..3102a3b7 100644 --- a/app/src/main/res/xml-v14/preferences.xml +++ b/app/src/main/res/xml-v14/preferences.xml @@ -14,12 +14,18 @@ android:defaultValue="true" android:key="whitelist_other" android:title="@string/setting_whitelist_other" /> + +