diff --git a/sdk/src/java/org/lineageos/internal/statusbar/NetworkTraffic.java b/sdk/src/java/org/lineageos/internal/statusbar/NetworkTraffic.java index b286fe4fffef7dd694e2dcf5614499efce6403c6..113ac4044f73470492a6536382c8f65082391193 100644 --- a/sdk/src/java/org/lineageos/internal/statusbar/NetworkTraffic.java +++ b/sdk/src/java/org/lineageos/internal/statusbar/NetworkTraffic.java @@ -26,6 +26,7 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; @@ -110,6 +111,10 @@ public class NetworkTraffic extends TextView { private int mIconTint = Color.WHITE; private Drawable mDrawable; + // Network tracking related variables + private NetworkCallback mNetworkCallback; + private NetworkCallback mDefaultNetworkCallback; + private final HashMap mLinkPropertiesMap = new HashMap<>(); // Used to indicate that the set of sources contributing // to current stats have changed. @@ -132,6 +137,10 @@ public class NetworkTraffic extends TextView { mNetworkTrafficIsVisible = false; + ContentResolver resolver = mContext.getContentResolver(); + mMode = LineageSettings.Secure.getInt(resolver, + LineageSettings.Secure.NETWORK_TRAFFIC_MODE, MODE_DISABLED); + mTrafficHandler = new Handler(mContext.getMainLooper()) { @Override public void handleMessage(Message msg) { @@ -304,46 +313,74 @@ public class NetworkTraffic extends TextView { }; mObserver = new SettingsObserver(mTrafficHandler); - // Network tracking related variables - final NetworkRequest request = new NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) - .build(); - ConnectivityManager.NetworkCallback networkCallback = - new ConnectivityManager.NetworkCallback() { - @Override - public void onLinkPropertiesChanged(Network network, - LinkProperties linkProperties) { - Message msg = new Message(); - msg.what = MESSAGE_TYPE_ADD_NETWORK; - msg.obj = new LinkPropertiesHolder(network, linkProperties); - mTrafficHandler.sendMessage(msg); - } + manageNetworkCallbacks(); + } - @Override - public void onLost(Network network) { - Message msg = new Message(); - msg.what = MESSAGE_TYPE_REMOVE_NETWORK; - msg.obj = network; - mTrafficHandler.sendMessage(msg); - } - }; - ConnectivityManager.NetworkCallback defaultNetworkCallback = - new ConnectivityManager.NetworkCallback() { - @Override - public void onAvailable(Network network) { - updateViewState(); + private void manageNetworkCallbacks() { + ConnectivityManager connectivityManager = + mContext.getSystemService(ConnectivityManager.class); + + if (mMode == MODE_DISABLED) { + // Unregister callbacks if disabling + if (mNetworkCallback != null) { + connectivityManager.unregisterNetworkCallback(mNetworkCallback); + mNetworkCallback = null; + } + if (mDefaultNetworkCallback != null) { + connectivityManager.unregisterNetworkCallback(mDefaultNetworkCallback); + mDefaultNetworkCallback = null; } + return; + } - @Override - public void onLost(Network network) { - updateViewState(); + // Register callbacks if enabling + if (mNetworkCallback == null) { + mNetworkCallback = new NetworkCallback() { + @Override + public void onLinkPropertiesChanged(Network network, + LinkProperties linkProperties) { + Message msg = new Message(); + msg.what = MESSAGE_TYPE_ADD_NETWORK; + msg.obj = new LinkPropertiesHolder(network, linkProperties); + mTrafficHandler.sendMessage(msg); + } + + @Override + public void onLost(Network network) { + Message msg = new Message(); + msg.what = MESSAGE_TYPE_REMOVE_NETWORK; + msg.obj = network; + mTrafficHandler.sendMessage(msg); + } + }; + + NetworkRequest request = new NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) + .build(); + + connectivityManager.registerNetworkCallback(request, mNetworkCallback); + } + + if (mDefaultNetworkCallback == null) { + mDefaultNetworkCallback = new NetworkCallback() { + @Override + public void onAvailable(Network network) { + updateViewState(); + } + + @Override + public void onLost(Network network) { + updateViewState(); + } + }; + + try { + connectivityManager.registerDefaultNetworkCallback(mDefaultNetworkCallback); + } catch (RuntimeException e) { + Log.e(TAG, "Failed to register network callback", e); } - }; - context.getSystemService(ConnectivityManager.class) - .registerNetworkCallback(request, networkCallback); - context.getSystemService(ConnectivityManager.class) - .registerDefaultNetworkCallback(defaultNetworkCallback); + } } public void setViewPosition(int vpos) { @@ -443,6 +480,8 @@ public class NetworkTraffic extends TextView { mShowUnits = LineageSettings.Secure.getInt(resolver, LineageSettings.Secure.NETWORK_TRAFFIC_SHOW_UNITS, SHOW_UNITS_ON); + manageNetworkCallbacks(); + switch (mUnits) { case UNITS_KILOBITS: mAutoHideThreshold = AUTOHIDE_THRESHOLD_KILOBITS;