Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1dabb64c authored by Aaron Huang's avatar Aaron Huang Committed by Automerger Merge Worker
Browse files

Merge "Have NetworkPolicyManagerService listen onLinkPropertiesChanged...

Merge "Have NetworkPolicyManagerService listen onLinkPropertiesChanged callback" am: e441813c am: d47cadad am: ae1e423e

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2063315



Change-Id: I97c76411131b564ed1be302840f0b32f235825e3
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 3a193726 ae1e423e
Loading
Loading
Loading
Loading
+44 −3
Original line number Diff line number Diff line
@@ -174,6 +174,7 @@ import android.net.ConnectivityManager.NetworkCallback;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkIdentity;
@@ -236,6 +237,7 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.SparseLongArray;
import android.util.SparseSetArray;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
import android.util.Xml;
@@ -624,6 +626,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    /** Map from network ID to last observed roaming state */
    @GuardedBy("mNetworkPoliciesSecondLock")
    private final SparseBooleanArray mNetworkRoaming = new SparseBooleanArray();
    /** Map from network ID to the last ifaces on it */
    @GuardedBy("mNetworkPoliciesSecondLock")
    private SparseSetArray<String> mNetworkToIfaces = new SparseSetArray<>();

    /** Map from netId to subId as of last update */
    @GuardedBy("mNetworkPoliciesSecondLock")
@@ -1328,11 +1333,28 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        return changed;
    }

    @GuardedBy("mNetworkPoliciesSecondLock")
    private boolean updateNetworkToIfacesNL(int netId, @NonNull ArraySet<String> newIfaces) {
        // TODO: Add a facility SparseSetArray.contains(key) to return whether the key exists.
        final ArraySet<String> lastIfaces = mNetworkToIfaces.get(netId);
        final boolean changed = lastIfaces == null ? true : !lastIfaces.equals(newIfaces);

        if (changed) {
            // Changed on the same network should remove last ifaces and add new ifaces.
            // TODO: Add a facility SparseSetArray.put(key, value) for replacing the
            //       value for a given key.
            mNetworkToIfaces.remove(netId);
            for (String iface : newIfaces) {
                mNetworkToIfaces.add(netId, iface);
            }
        }
        return changed;
    }

    private final NetworkCallback mNetworkCallback = new NetworkCallback() {
        @Override
        public void onCapabilitiesChanged(Network network,
                NetworkCapabilities networkCapabilities) {
            if (network == null || networkCapabilities == null) return;
        public void onCapabilitiesChanged(@NonNull Network network,
                @NonNull NetworkCapabilities networkCapabilities) {

            synchronized (mNetworkPoliciesSecondLock) {
                final boolean newMetered = !networkCapabilities
@@ -1351,6 +1373,25 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                }
            }
        }

        @Override
        public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties lp) {
            synchronized (mNetworkPoliciesSecondLock) {
                final ArraySet<String> newIfaces = new ArraySet<>(lp.getAllInterfaceNames());
                final boolean ifacesChanged = updateNetworkToIfacesNL(network.getNetId(),
                        newIfaces);
                if (ifacesChanged) {
                    updateNetworkRulesNL();
                }
            }
        }

        @Override
        public void onLost(@NonNull Network network) {
            synchronized (mNetworkPoliciesSecondLock) {
                mNetworkToIfaces.remove(network.getNetId());
            }
        }
    };

    /**