Propagate network state changes to the LockdownVpnTracker.

Bug: 17695048
Change-Id: I10378df0ab545729a6a315fd1bc8870cd98f47b3
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index b29cdf4..6a6dcaf 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2001,9 +2001,7 @@
                     } else if (state == NetworkInfo.State.CONNECTED) {
                     //    handleConnect(info);
                     }
-                    if (mLockdownTracker != null) {
-                        mLockdownTracker.onNetworkInfoChanged(info);
-                    }
+                    notifyLockdownVpn(null);
                     break;
                 }
                 case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED: {
@@ -2126,6 +2124,7 @@
             if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
                 removeDataActivityTracking(nai);
                 mActiveDefaultNetwork = ConnectivityManager.TYPE_NONE;
+                notifyLockdownVpn(nai);
                 requestNetworkTransitionWakelock(nai.name());
             }
             for (NetworkAgentInfo networkToActivate : toActivate) {
@@ -3801,6 +3800,7 @@
         } catch (Exception e) {
             loge("Exception setting default network :" + e);
         }
+        notifyLockdownVpn(newNetwork);
         handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
         updateTcpBufferSizes(newNetwork);
     }
@@ -3916,6 +3916,7 @@
                         }
                         mDefaultInetConditionPublished = newNetwork.validated ? 100 : 0;
                         mLegacyTypeTracker.add(newNetwork.networkInfo.getType(), newNetwork);
+                        notifyLockdownVpn(newNetwork);
                     }
                 }
             }
@@ -4035,6 +4036,16 @@
         sendInetConditionBroadcast(nai.networkInfo);
     }
 
+    private void notifyLockdownVpn(NetworkAgentInfo nai) {
+        if (mLockdownTracker != null) {
+            if (nai != null && nai.isVPN()) {
+                mLockdownTracker.onVpnStateChanged(nai.networkInfo);
+            } else {
+                mLockdownTracker.onNetworkInfoChanged();
+            }
+        }
+    }
+
     private void updateNetworkInfo(NetworkAgentInfo networkAgent, NetworkInfo newInfo) {
         NetworkInfo.State state = newInfo.getState();
         NetworkInfo oldInfo = null;
@@ -4042,9 +4053,7 @@
             oldInfo = networkAgent.networkInfo;
             networkAgent.networkInfo = newInfo;
         }
-        if (networkAgent.isVPN() && mLockdownTracker != null) {
-            mLockdownTracker.onVpnStateChanged(newInfo);
-        }
+        notifyLockdownVpn(networkAgent);
 
         if (oldInfo != null && oldInfo.getState() == state) {
             if (VDBG) log("ignoring duplicate network state non-change");
diff --git a/services/core/java/com/android/server/net/LockdownVpnTracker.java b/services/core/java/com/android/server/net/LockdownVpnTracker.java
index 04df3e7..e9c7751 100644
--- a/services/core/java/com/android/server/net/LockdownVpnTracker.java
+++ b/services/core/java/com/android/server/net/LockdownVpnTracker.java
@@ -25,6 +25,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.net.ConnectivityManager;
 import android.net.LinkProperties;
 import android.net.LinkAddress;
 import android.net.NetworkInfo;
@@ -113,7 +114,6 @@
      * connection when ready, or setting firewall rules once VPN is connected.
      */
     private void handleStateChangedLocked() {
-        Slog.d(TAG, "handleStateChanged()");
 
         final NetworkInfo egressInfo = mConnService.getActiveNetworkInfoUnfiltered();
         final LinkProperties egressProp = mConnService.getActiveLinkProperties();
@@ -126,6 +126,14 @@
                 || State.DISCONNECTED.equals(egressInfo.getState());
         final boolean egressChanged = egressProp == null
                 || !TextUtils.equals(mAcceptedEgressIface, egressProp.getInterfaceName());
+
+        final String egressTypeName = (egressInfo == null) ?
+                null : ConnectivityManager.getNetworkTypeName(egressInfo.getType());
+        final String egressIface = (egressProp == null) ?
+                null : egressProp.getInterfaceName();
+        Slog.d(TAG, "handleStateChanged: egress=" + egressTypeName +
+                " " + mAcceptedEgressIface + "->" + egressIface);
+
         if (egressDisconnected || egressChanged) {
             clearSourceRulesLocked();
             mAcceptedEgressIface = null;
@@ -252,6 +260,7 @@
     }
 
     public void reset() {
+        Slog.d(TAG, "reset()");
         synchronized (mStateLock) {
             // cycle tracker, reset error count, and trigger retry
             shutdownLocked();
@@ -277,7 +286,7 @@
         }
     }
 
-    public void onNetworkInfoChanged(NetworkInfo info) {
+    public void onNetworkInfoChanged() {
         synchronized (mStateLock) {
             handleStateChangedLocked();
         }