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

Commit 1e96b6ef 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 am: 1dabb64c

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



Change-Id: Icb71a9ead83c1ac9d6a0b18f18dd65cef12f2493
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 20d0894f 1dabb64c
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());
            }
        }
    };

    /**