Snap for 5656475 from 93b2fa30a944d0c2ab9152cd79eac165696df0f2 to qt-release

Change-Id: I423b645d6d21f3e8df31befbc137a866d8f61fc6
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java
index 9a8b304..0b2c051 100644
--- a/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/src/com/android/server/connectivity/NetworkMonitor.java
@@ -24,6 +24,9 @@
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.ConnectivityManager.TYPE_WIFI;
 import static android.net.DnsResolver.FLAG_EMPTY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTP;
@@ -93,6 +96,7 @@
 import android.net.util.Stopwatch;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Message;
 import android.os.RemoteException;
@@ -286,6 +290,7 @@
 
     private final Context mContext;
     private final INetworkMonitorCallbacks mCallback;
+    private final int mCallbackVersion;
     private final Network mCleartextDnsNetwork;
     private final Network mNetwork;
     private final TelephonyManager mTelephonyManager;
@@ -355,6 +360,17 @@
     private boolean mAcceptPartialConnectivity = false;
     private final EvaluationState mEvaluationState = new EvaluationState();
 
+    private int getCallbackVersion(INetworkMonitorCallbacks cb) {
+        int version;
+        try {
+            version = cb.getInterfaceVersion();
+        } catch (RemoteException e) {
+            version = 0;
+        }
+        if (version == Build.VERSION_CODES.CUR_DEVELOPMENT) version = 0;
+        return version;
+    }
+
     public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
             SharedLog validationLog) {
         this(context, cb, network, new IpConnectivityLog(), validationLog,
@@ -376,6 +392,7 @@
         mMetricsLog = logger;
         mValidationLogs = validationLogs;
         mCallback = cb;
+        mCallbackVersion = getCallbackVersion(cb);
         mDependencies = deps;
         mDetectionStatsUtils = detectionStatsUtils;
         mNetwork = network;
@@ -2113,6 +2130,15 @@
         }
 
         protected int getNetworkTestResult() {
+            if (mCallbackVersion < 3) {
+                if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_VALID) != 0) {
+                    return NETWORK_TEST_RESULT_VALID;
+                }
+                if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_PARTIAL) != 0) {
+                    return NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+                }
+                return NETWORK_TEST_RESULT_INVALID;
+            }
             return mEvaluationResult | mProbeResults;
         }
     }
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
index 287d598..c0d9427 100644
--- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -286,7 +286,7 @@
     private FakeDns mFakeDns;
 
     @Before
-    public void setUp() throws IOException {
+    public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         when(mDependencies.getPrivateDnsBypassNetwork(any())).thenReturn(mCleartextDnsNetwork);
         when(mDependencies.getDnsResolver()).thenReturn(mDnsResolver);
@@ -354,6 +354,8 @@
             return null;
         }).when(mContext).unregisterReceiver(any());
 
+        resetCallbacks();
+
         setMinDataStallEvaluateInterval(500);
         setDataStallEvaluationType(DATA_STALL_EVALUATION_TYPE_DNS);
         setValidDataStallDnsTimeThreshold(500);
@@ -381,6 +383,17 @@
                 0, mRegisteredReceivers.size());
     }
 
+    private void resetCallbacks() {
+        reset(mCallbacks);
+        // TODO: make this a parameterized test.
+        try {
+            when(mCallbacks.getInterfaceVersion()).thenReturn(3);
+        } catch (RemoteException e) {
+            // Can't happen as mCallbacks is a mock
+            fail("Error mocking getInterfaceVersion" + e);
+        }
+    }
+
     private class WrappedNetworkMonitor extends NetworkMonitor {
         private long mProbeTime = 0;
         private final ConditionVariable mQuitCv = new ConditionVariable(false);
@@ -727,7 +740,7 @@
         setStatus(mHttpsConnection, 204);
         setStatus(mHttpConnection, 204);
 
-        reset(mCallbacks);
+        resetCallbacks();
         nm.notifyCaptivePortalAppFinished(APP_RETURN_DISMISSED);
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
                 .notifyNetworkTested(eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP
@@ -765,7 +778,7 @@
                         eq(null));
 
         // Fix DNS and retry, expect validation to succeed.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setAnswer("dns.google", new String[]{"2001:db8::1"});
 
         wnm.forceReevaluation(Process.myUid());
@@ -774,7 +787,7 @@
                         eq(null));
 
         // Change configuration to an invalid DNS name, expect validation to fail.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setAnswer("dns.bad", new String[0]);
         wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.bad", new InetAddress[0]));
         // Strict mode hostname resolve fail. Expect only notification for evaluation fail. No probe
@@ -785,7 +798,7 @@
 
         // Change configuration back to working again, but make private DNS not work.
         // Expect validation to fail.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setNonBypassPrivateDnsWorking(false);
         wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.google",
                 new InetAddress[0]));
@@ -795,7 +808,7 @@
                         eq(null));
 
         // Make private DNS work again. Expect validation to succeed.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setNonBypassPrivateDnsWorking(true);
         wnm.forceReevaluation(Process.myUid());
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
@@ -863,7 +876,7 @@
         // Expect to send HTTP, HTTPS, FALLBACK probe and evaluation result notifications to CS.
         final NetworkMonitor nm = runNetworkTest(VALIDATION_RESULT_PARTIAL);
 
-        reset(mCallbacks);
+        resetCallbacks();
         nm.setAcceptPartialConnectivity();
         // Expect to update evaluation result notifications to CS.
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)).notifyNetworkTested(
@@ -877,7 +890,7 @@
         setStatus(mFallbackConnection, 500);
         runPartialConnectivityNetworkTest(VALIDATION_RESULT_PARTIAL);
 
-        reset(mCallbacks);
+        resetCallbacks();
         setStatus(mHttpsConnection, 500);
         setStatus(mHttpConnection, 500);
         setStatus(mFallbackConnection, 204);
@@ -930,7 +943,7 @@
         final NetworkMonitor nm = runValidatedNetworkTest();
         // Verify forceReevalution will not reset the validation result but only probe result until
         // getting the validation result.
-        reset(mCallbacks);
+        resetCallbacks();
         setSslException(mHttpsConnection);
         setStatus(mHttpConnection, 500);
         setStatus(mFallbackConnection, 204);
@@ -955,7 +968,7 @@
     public void testEvaluationState_reportProbeResult() throws Exception {
         final NetworkMonitor nm = runValidatedNetworkTest();
 
-        reset(mCallbacks);
+        resetCallbacks();
 
         nm.reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, CaptivePortalProbeResult.SUCCESS);
         // Verify result should be appended and notifyNetworkTested callback is triggered once.