From 05b3b0376de9cbe5e2484362970ea1ed87adf11e Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 22 Jul 2017 16:06:32 +0200 Subject: [PATCH] Use network callback on recent Android versions - no need to request phone permission anymore - might solve DNS problems (link properties changed) - preparation for Android O --- .../faircode/netguard/ActivitySettings.java | 186 ++---------------- .../eu/faircode/netguard/AdapterRule.java | 4 - .../eu/faircode/netguard/ServiceSinkhole.java | 184 +++++++++-------- .../main/java/eu/faircode/netguard/Util.java | 1 - 4 files changed, 115 insertions(+), 260 deletions(-) diff --git a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java index 3dea7d29..04dcbc50 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivitySettings.java +++ b/app/src/main/java/eu/faircode/netguard/ActivitySettings.java @@ -47,14 +47,10 @@ import android.preference.PreferenceGroup; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.preference.TwoStatePreference; -import android.support.annotation.NonNull; import android.support.v4.app.NavUtils; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; -import android.telephony.PhoneStateListener; -import android.telephony.ServiceState; -import android.telephony.TelephonyManager; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -98,17 +94,10 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere private static final String TAG = "NetGuard.Settings"; private boolean running = false; - private boolean phone_state = false; private static final int REQUEST_EXPORT = 1; private static final int REQUEST_IMPORT = 2; - private static final int REQUEST_METERED2 = 3; - private static final int REQUEST_METERED3 = 4; - private static final int REQUEST_METERED4 = 5; - private static final int REQUEST_ROAMING_EU = 6; - private static final int REQUEST_ROAMING_NATIONAL = 7; - private static final int REQUEST_ROAMING_INTERNATIONAL = 8; - private static final int REQUEST_HOSTS = 9; + private static final int REQUEST_HOSTS = 3; private AlertDialog dialogFilter = null; @@ -401,12 +390,10 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere // Technical info Preference pref_technical_info = screen.findPreference("technical_info"); Preference pref_technical_network = screen.findPreference("technical_network"); - Preference pref_technical_subscription = screen.findPreference("technical_subscription"); pref_technical_info.setEnabled(INTENT_VPN_SETTINGS.resolveActivity(this.getPackageManager()) != null); pref_technical_info.setIntent(INTENT_VPN_SETTINGS); pref_technical_info.setOnPreferenceClickListener(listener); pref_technical_network.setOnPreferenceClickListener(listener); - pref_technical_subscription.setOnPreferenceClickListener(listener); updateTechnicalInfo(); markPro(screen.findPreference("theme"), ActivityPro.SKU_THEME); @@ -418,9 +405,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere protected void onResume() { super.onResume(); - // Check if permissions were revoked - checkPermissions(); - // Listen for preference changes SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); @@ -435,12 +419,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere IntentFilter ifConnectivity = new IntentFilter(); ifConnectivity.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(connectivityChangedReceiver, ifConnectivity); - - if (Util.hasPhoneStatePermission(this)) { - TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - tm.listen(phoneStateListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_SERVICE_STATE); - phone_state = true; - } } @Override @@ -452,12 +430,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere unregisterReceiver(interactiveStateReceiver); unregisterReceiver(connectivityChangedReceiver); - - if (phone_state) { - TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); - phone_state = false; - } } @Override @@ -525,16 +497,10 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere "screen_other".equals(name)) ServiceSinkhole.reload("changed " + name, this, false); - else if ("whitelist_roaming".equals(name)) { - if (prefs.getBoolean(name, false)) { - if (Util.hasPhoneStatePermission(this)) - ServiceSinkhole.reload("changed " + name, this, false); - else - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_INTERNATIONAL); - } else - ServiceSinkhole.reload("changed " + name, this, false); + else if ("whitelist_roaming".equals(name)) + ServiceSinkhole.reload("changed " + name, this, false); - } else if ("auto_enable".equals(name)) + 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)) @@ -569,40 +535,16 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere else if ("unmetered_2g".equals(name) || "unmetered_3g".equals(name) || - "unmetered_4g".equals(name)) { - if (prefs.getBoolean(name, false)) { - if (Util.hasPhoneStatePermission(this)) - ServiceSinkhole.reload("changed " + name, this, false); - else { - if ("unmetered_2g".equals(name)) - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED2); - else if ("unmetered_3g".equals(name)) - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED3); - else if ("unmetered_4g".equals(name)) - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED4); - } - } else - ServiceSinkhole.reload("changed " + name, this, false); + "unmetered_4g".equals(name)) + ServiceSinkhole.reload("changed " + name, this, false); - } else if ("eu_roaming".equals(name)) { - if (prefs.getBoolean(name, false)) { - if (Util.hasPhoneStatePermission(this)) - ServiceSinkhole.reload("changed " + name, this, false); - else - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_EU); - } else - ServiceSinkhole.reload("changed " + name, this, false); + else if ("national_roaming".equals(name)) + ServiceSinkhole.reload("changed " + name, this, false); - } else if ("national_roaming".equals(name)) { - if (prefs.getBoolean(name, false)) { - if (Util.hasPhoneStatePermission(this)) - ServiceSinkhole.reload("changed " + name, this, false); - else - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_NATIONAL); - } else - ServiceSinkhole.reload("changed " + name, this, false); + else if ("eu_roaming".equals(name)) + ServiceSinkhole.reload("changed " + name, this, false); - } else if ("lockdown_wifi".equals(name) || "lockdown_other".equals(name)) + else if ("lockdown_wifi".equals(name) || "lockdown_other".equals(name)) ServiceSinkhole.reload("changed " + name, this, false); else if ("manage_system".equals(name)) { @@ -777,99 +719,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere throw new IllegalArgumentException("Bad address"); } - @TargetApi(Build.VERSION_CODES.M) - private void checkPermissions() { - PreferenceScreen screen = getPreferenceScreen(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - - // Check if permission was revoked - if (prefs.getBoolean("whitelist_roaming", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("whitelist_roaming", false).apply(); - ((TwoStatePreference) screen.findPreference("whitelist_roaming")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_INTERNATIONAL); - } - - // Check if permission was revoked - if (prefs.getBoolean("unmetered_2g", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("unmetered_2g", false).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_2g")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED2); - } - - if (prefs.getBoolean("unmetered_3g", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("unmetered_3g", false).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_3g")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED3); - } - - if (prefs.getBoolean("unmetered_4g", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("unmetered_4g", false).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_4g")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_METERED4); - } - - // Check if permission was revoked - if (prefs.getBoolean("eu_roaming", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("eu_roaming", false).apply(); - ((TwoStatePreference) screen.findPreference("eu_roaming")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_EU); - } - - if (prefs.getBoolean("national_roaming", false)) - if (!Util.hasPhoneStatePermission(this)) { - prefs.edit().putBoolean("national_roaming", false).apply(); - ((TwoStatePreference) screen.findPreference("national_roaming")).setChecked(false); - - requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_ROAMING_NATIONAL); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - PreferenceScreen screen = getPreferenceScreen(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - - boolean granted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED); - - if (requestCode == REQUEST_METERED2) { - prefs.edit().putBoolean("unmetered_2g", granted).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_2g")).setChecked(granted); - - } else if (requestCode == REQUEST_METERED3) { - prefs.edit().putBoolean("unmetered_3g", granted).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_3g")).setChecked(granted); - - } else if (requestCode == REQUEST_METERED4) { - prefs.edit().putBoolean("unmetered_4g", granted).apply(); - ((TwoStatePreference) screen.findPreference("unmetered_4g")).setChecked(granted); - - } else if (requestCode == REQUEST_ROAMING_EU) { - prefs.edit().putBoolean("eu_roaming", granted).apply(); - ((TwoStatePreference) screen.findPreference("eu_roaming")).setChecked(granted); - - } else if (requestCode == REQUEST_ROAMING_NATIONAL) { - prefs.edit().putBoolean("national_roaming", granted).apply(); - ((TwoStatePreference) screen.findPreference("national_roaming")).setChecked(granted); - - } else if (requestCode == REQUEST_ROAMING_INTERNATIONAL) { - prefs.edit().putBoolean("whitelist_roaming", granted).apply(); - ((TwoStatePreference) screen.findPreference("whitelist_roaming")).setChecked(granted); - } - - if (granted) - ServiceSinkhole.reload("permission granted", this, false); - } - private BroadcastReceiver interactiveStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -886,18 +735,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere } }; - private PhoneStateListener phoneStateListener = new PhoneStateListener() { - @Override - public void onDataConnectionStateChanged(int state) { - updateTechnicalInfo(); - } - - @Override - public void onServiceStateChanged(ServiceState serviceState) { - updateTechnicalInfo(); - } - }; - private void markPro(Preference pref, String sku) { if (sku == null || !IAB.isPurchased(sku, this)) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -912,7 +749,6 @@ public class ActivitySettings extends AppCompatActivity implements SharedPrefere PreferenceScreen screen = getPreferenceScreen(); Preference pref_technical_info = screen.findPreference("technical_info"); Preference pref_technical_network = screen.findPreference("technical_network"); - Preference pref_technical_subscription = screen.findPreference("technical_subscription"); pref_technical_info.setSummary(Util.getGeneralInfo(this)); pref_technical_network.setSummary(Util.getNetworkInfo(this)); diff --git a/app/src/main/java/eu/faircode/netguard/AdapterRule.java b/app/src/main/java/eu/faircode/netguard/AdapterRule.java index db6d2c0f..2d199fd6 100644 --- a/app/src/main/java/eu/faircode/netguard/AdapterRule.java +++ b/app/src/main/java/eu/faircode/netguard/AdapterRule.java @@ -531,10 +531,6 @@ public class AdapterRule extends RecyclerView.Adapter im public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { rule.roaming = isChecked; updateRule(rule, true, listAll); - - // Request permissions - if (isChecked && !Util.hasPhoneStatePermission(context)) - context.requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, ActivityMain.REQUEST_ROAMING); } }); diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index 0aae23e6..f295de9f 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -40,7 +40,11 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.Typeface; import android.net.ConnectivityManager; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; import android.net.NetworkInfo; +import android.net.NetworkRequest; import android.net.TrafficStats; import android.net.Uri; import android.net.VpnService; @@ -59,7 +63,6 @@ import android.support.v4.app.NotificationManagerCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.telephony.PhoneStateListener; -import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.text.Spannable; import android.text.SpannableString; @@ -114,13 +117,15 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS private boolean registeredConnectivityChanged = false; private boolean registeredPackageChanged = false; + private boolean phone_state = false; + private Object networkCallback = null; + private State state = State.none; private boolean user_foreground = true; private boolean last_connected = false; private boolean last_metered = true; private boolean last_interactive = false; private boolean powersaving = false; - private boolean phone_state = false; private ServiceSinkhole.Builder last_builder = null; private ParcelFileDescriptor vpn = null; @@ -315,14 +320,6 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS } } - // Listen for phone state changes - TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - if (tm != null && !phone_state && Util.hasPhoneStatePermission(ServiceSinkhole.this)) { - Log.i(TAG, "Starting listening to service state changes"); - tm.listen(phoneStateListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_SERVICE_STATE); - phone_state = true; - } - // Watchdog if (cmd == Command.start || cmd == Command.reload) { Intent watchdogIntent = new Intent(ServiceSinkhole.this, ServiceSinkhole.class); @@ -1900,6 +1897,29 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS } }; + private PhoneStateListener phoneStateListener = new PhoneStateListener() { + private String last_generation = null; + + @Override + public void onDataConnectionStateChanged(int state, int networkType) { + if (state == TelephonyManager.DATA_CONNECTED) { + String current_generation = Util.getNetworkGeneration(ServiceSinkhole.this); + Log.i(TAG, "Data connected generation=" + current_generation); + + if (last_generation == null || !last_generation.equals(current_generation)) { + Log.i(TAG, "New network generation=" + current_generation); + last_generation = current_generation; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this); + if (prefs.getBoolean("unmetered_2g", false) || + prefs.getBoolean("unmetered_3g", false) || + prefs.getBoolean("unmetered_4g", false)) + reload("data connection state changed", ServiceSinkhole.this, false); + } + } + } + }; + private BroadcastReceiver packageChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -2054,60 +2074,6 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS } } - private PhoneStateListener phoneStateListener = new PhoneStateListener() { - private String last_generation = null; - private int last_eu = -1; - private int last_national = -1; - - @Override - public void onDataConnectionStateChanged(int state, int networkType) { - if (state == TelephonyManager.DATA_CONNECTED) { - String current_generation = Util.getNetworkGeneration(ServiceSinkhole.this); - Log.i(TAG, "Data connected generation=" + current_generation); - - if (last_generation == null || !last_generation.equals(current_generation)) { - Log.i(TAG, "New network generation=" + current_generation); - last_generation = current_generation; - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this); - if (prefs.getBoolean("unmetered_2g", false) || - prefs.getBoolean("unmetered_3g", false) || - prefs.getBoolean("unmetered_4g", false)) - reload("data connection state changed", ServiceSinkhole.this, false); - } - } - } - - @Override - public void onServiceStateChanged(ServiceState serviceState) { - if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) { - int current_eu = (Util.isEU(ServiceSinkhole.this) ? 1 : 0); - int current_national = (Util.isNational(ServiceSinkhole.this) ? 1 : 0); - Log.i(TAG, "In service eu=" + current_eu + " national=" + current_national); - - boolean reload = false; - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this); - - if (last_eu != current_eu) { - Log.i(TAG, "New eu=" + current_eu); - last_eu = current_eu; - if (prefs.getBoolean("eu_roaming", false)) - reload = true; - } - - if (last_national != current_national) { - Log.i(TAG, "New national=" + current_national); - last_national = current_national; - if (prefs.getBoolean("national_roaming", false)) - reload = true; - } - - if (reload) - reload("service state changed", ServiceSinkhole.this, false); - } - } - }; - @Override public void onCreate() { Log.i(TAG, "Create version=" + Util.getSelfVersionName(this) + "/" + Util.getSelfVersionCode(this)); @@ -2158,21 +2124,15 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS registeredUser = true; } + // Listen for idle mode state changes if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // Listen for idle mode state changes IntentFilter ifIdle = new IntentFilter(); ifIdle.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); registerReceiver(idleStateReceiver, ifIdle); registeredIdleState = true; } - // Listen for connectivity updates - IntentFilter ifConnectivity = new IntentFilter(); - ifConnectivity.addAction(ConnectivityManager.CONNECTIVITY_ACTION); - registerReceiver(connectivityChangedReceiver, ifConnectivity); - registeredConnectivityChanged = true; - - // Listen for added applications + // Listen for added/removed applications IntentFilter ifPackage = new IntentFilter(); ifPackage.addAction(Intent.ACTION_PACKAGE_ADDED); ifPackage.addAction(Intent.ACTION_PACKAGE_REMOVED); @@ -2180,6 +2140,67 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS registerReceiver(packageChangedReceiver, ifPackage); registeredPackageChanged = true; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + // Listen for network changes + Log.i(TAG, "Starting listening to network changes"); + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkRequest.Builder builder = new NetworkRequest.Builder(); + builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + + ConnectivityManager.NetworkCallback nc = new ConnectivityManager.NetworkCallback() { + private String last_generation = null; + + @Override + public void onAvailable(Network network) { + reload("network available", ServiceSinkhole.this, false); + } + + @Override + public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { + reload("link properties changed", ServiceSinkhole.this, false); + } + + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { + String current_generation = Util.getNetworkGeneration(ServiceSinkhole.this); + Log.i(TAG, "Capabilities changed generation=" + current_generation); + + if (last_generation == null || !last_generation.equals(current_generation)) { + Log.i(TAG, "New network generation=" + current_generation); + last_generation = current_generation; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ServiceSinkhole.this); + if (prefs.getBoolean("unmetered_2g", false) || + prefs.getBoolean("unmetered_3g", false) || + prefs.getBoolean("unmetered_4g", false)) + reload("data connection state changed", ServiceSinkhole.this, false); + } + } + + @Override + public void onLost(Network network) { + reload("network lost", ServiceSinkhole.this, false); + } + }; + cm.registerNetworkCallback(builder.build(), nc); + networkCallback = nc; + } else { + // Listen for connectivity updates + Log.i(TAG, "Starting listening to connectivity changes"); + IntentFilter ifConnectivity = new IntentFilter(); + ifConnectivity.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + registerReceiver(connectivityChangedReceiver, ifConnectivity); + registeredConnectivityChanged = true; + + // Listen for phone state changes + Log.i(TAG, "Starting listening to service state changes"); + TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + if (tm != null) { + tm.listen(phoneStateListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); + phone_state = true; + } + } + // Setup house holding Intent alarmIntent = new Intent(this, ServiceSinkhole.class); alarmIntent.setAction(ACTION_HOUSE_HOLDING); @@ -2320,21 +2341,24 @@ public class ServiceSinkhole extends VpnService implements SharedPreferences.OnS unregisterReceiver(idleStateReceiver); registeredIdleState = false; } - if (registeredConnectivityChanged) { - unregisterReceiver(connectivityChangedReceiver); - registeredConnectivityChanged = false; - } if (registeredPackageChanged) { unregisterReceiver(packageChangedReceiver); registeredPackageChanged = false; } + if (networkCallback != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + cm.unregisterNetworkCallback((ConnectivityManager.NetworkCallback) networkCallback); + networkCallback = null; + } + if (registeredConnectivityChanged) { + unregisterReceiver(connectivityChangedReceiver); + registeredConnectivityChanged = false; + } if (phone_state) { TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - if (tm != null) { - tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); - phone_state = false; - } + tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); + phone_state = false; } try { diff --git a/app/src/main/java/eu/faircode/netguard/Util.java b/app/src/main/java/eu/faircode/netguard/Util.java index 2a2cce06..3b18fccf 100644 --- a/app/src/main/java/eu/faircode/netguard/Util.java +++ b/app/src/main/java/eu/faircode/netguard/Util.java @@ -773,7 +773,6 @@ public class Util { } catch (Throwable ex) { sb.append("Prepared: ").append((ex.toString())).append("\r\n").append(Log.getStackTraceString(ex)); } - sb.append(String.format("Permission: %B\r\n", hasPhoneStatePermission(context))); sb.append("\r\n"); sb.append(getGeneralInfo(context));