Merge "Snap for 4604451 from 485c16b4d32168d7efa29dbc3b9d4828d46d8dfe to nougat-mr1-cts-release" into nougat-mr1-cts-release
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index bb41de2..6e51442 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
       android:versionCode="5"
-      android:versionName="7.1_r14">
+      android:versionName="7.1_r15">
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="25"/>
 
diff --git a/hostsidetests/security/src/android/security/cts/SecurityTestCase.java b/hostsidetests/security/src/android/security/cts/SecurityTestCase.java
index b6599c1..17cdc2c 100644
--- a/hostsidetests/security/src/android/security/cts/SecurityTestCase.java
+++ b/hostsidetests/security/src/android/security/cts/SecurityTestCase.java
@@ -42,8 +42,10 @@
     public void setUp() throws Exception {
         super.setUp();
 
-        kernelStartTime = System.currentTimeMillis()/1000 -
-            Integer.parseInt(getDevice().executeShellCommand("cut -f1 -d. /proc/uptime").trim());
+        String cmdOut = getDevice().executeShellCommand("dumpsys meminfo");
+        long uptime = Long.parseLong(cmdOut.substring(cmdOut.indexOf("Uptime: ") + 8,
+                      cmdOut.indexOf("Realtime: ") - 1))/1000;
+        kernelStartTime = System.currentTimeMillis()/1000 - uptime;
         //TODO:(badash@): Watch for other things to track.
         //     Specifically time when app framework starts
     }
@@ -70,10 +72,11 @@
     @Override
     public void tearDown() throws Exception {
         getDevice().waitForDeviceOnline(60 * 1000);
+        String cmdOut = getDevice().executeShellCommand("dumpsys meminfo");
+        long uptime = Long.parseLong(cmdOut.substring(cmdOut.indexOf("Uptime: ") + 8,
+                      cmdOut.indexOf("Realtime: ") - 1))/1000;
         assertTrue("Phone has had a hard reset",
-            (System.currentTimeMillis()/1000 -
-                Integer.parseInt(getDevice().executeShellCommand("cut -f1 -d. /proc/uptime").trim())
-                    - kernelStartTime < 2));
+            (System.currentTimeMillis()/1000 - uptime - kernelStartTime < 2));
         //TODO(badash@): add ability to catch runtime restart
         getDevice().executeAdbCommand("unroot");
     }
diff --git a/tests/tests/security/res/raw/bug_65483665.mp4 b/tests/tests/security/res/raw/bug_65483665.mp4
new file mode 100644
index 0000000..105e274
--- /dev/null
+++ b/tests/tests/security/res/raw/bug_65483665.mp4
Binary files differ
diff --git a/tests/tests/security/res/raw/bug_69478425.mp4 b/tests/tests/security/res/raw/bug_69478425.mp4
new file mode 100644
index 0000000..b8ff0c5
--- /dev/null
+++ b/tests/tests/security/res/raw/bug_69478425.mp4
Binary files differ
diff --git a/tests/tests/security/src/android/security/cts/StagefrightTest.java b/tests/tests/security/src/android/security/cts/StagefrightTest.java
index 551504c..95aa9e4 100644
--- a/tests/tests/security/src/android/security/cts/StagefrightTest.java
+++ b/tests/tests/security/src/android/security/cts/StagefrightTest.java
@@ -198,6 +198,11 @@
      ***********************************************************/
 
     @SecurityTest
+    public void testStagefright_bug_65483665() throws Exception {
+        doStagefrightTest(R.raw.bug_65483665);
+    }
+
+    @SecurityTest
     public void testStagefright_cve_2017_0852_b_62815506() throws Exception {
         doStagefrightTest(R.raw.cve_2017_0852_b_62815506);
     }
@@ -208,6 +213,11 @@
      ***********************************************************/
 
     @SecurityTest
+    public void testStagefright_bug_69478425() throws Exception {
+        doStagefrightTest(R.raw.bug_69478425);
+    }
+
+    @SecurityTest
     public void testStagefright_bug_65717533() throws Exception {
         doStagefrightTest(R.raw.bug_65717533_header_corrupt);
     }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 7729baf..d0fffae 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -22,10 +22,13 @@
 import android.net.http.SslError;
 import android.os.Build;
 import android.test.ActivityInstrumentationTestCase2;
+import android.util.Base64;
 import android.util.Log;
 import android.webkit.ConsoleMessage;
 import android.webkit.SslErrorHandler;
 import android.webkit.WebIconDatabase;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebResourceRequest;
 import android.webkit.WebSettings;
 import android.webkit.WebSettings.TextSize;
 import android.webkit.WebStorage;
@@ -33,7 +36,10 @@
 import android.webkit.WebViewClient;
 import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
 import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
+
+import java.io.ByteArrayInputStream;
 import java.io.FileOutputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -952,61 +958,77 @@
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
         }
-        final class SslWebViewClient extends WaitForLoadedClient {
-            public SslWebViewClient() {
+
+        final String INSECURE_BASE_URL = "http://www.example.com/";
+        final String INSECURE_JS_URL = INSECURE_BASE_URL + "insecure.js";
+        final String INSECURE_IMG_URL = INSECURE_BASE_URL + "insecure.png";
+        final String SECURE_URL = "/secure.html";
+        final String JS_HTML = "<script src=\"" + INSECURE_JS_URL + "\"></script>";
+        final String IMG_HTML = "<img src=\"" + INSECURE_IMG_URL + "\" />";
+        final String SECURE_HTML = "<body>" + IMG_HTML + " " + JS_HTML + "</body>";
+        final String JS_CONTENT = "window.loaded_js = 42;";
+        final String IMG_CONTENT = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+
+        final class InterceptClient extends WaitForLoadedClient {
+            public int mInsecureJsCounter;
+            public int mInsecureImgCounter;
+
+            public InterceptClient() {
                 super(mOnUiThread);
             }
+
             @Override
-            public void onReceivedSslError(WebView view,
-                    SslErrorHandler handler, SslError error) {
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.proceed();
             }
+
+            @Override
+            public WebResourceResponse shouldInterceptRequest(
+                    WebView view, WebResourceRequest request) {
+                if (request.getUrl().toString().equals(INSECURE_JS_URL)) {
+                    mInsecureJsCounter++;
+                    return new WebResourceResponse("text/javascript", "utf-8",
+                        new ByteArrayInputStream(JS_CONTENT.getBytes(StandardCharsets.UTF_8)));
+                } else if (request.getUrl().toString().equals(INSECURE_IMG_URL)) {
+                    mInsecureImgCounter++;
+                    return new WebResourceResponse("image/gif", "utf-8",
+                        new ByteArrayInputStream(Base64.decode(IMG_CONTENT, Base64.DEFAULT)));
+                }
+
+                if (request.getUrl().toString().startsWith(INSECURE_BASE_URL)) {
+                    return new WebResourceResponse("text/html", "UTF-8", null);
+                }
+                return null;
+            }
         }
 
+        InterceptClient interceptClient = new InterceptClient();
+        mOnUiThread.setWebViewClient(interceptClient);
         mSettings.setJavaScriptEnabled(true);
         TestWebServer httpsServer = null;
-        TestWebServer httpServer = null;
         try {
             httpsServer = new TestWebServer(true);
-            httpServer = new TestWebServer(false);
-            final String JS_URL = "/insecure.js";
-            final String IMG_URL = "/insecure.png";
-            final String SECURE_URL = "/secure.html";
-            final String JS_HTML = "<script src=\"" + httpServer.getResponseUrl(JS_URL) +
-                "\"></script>";
-            final String IMG_HTML = "<img src=\"" + httpServer.getResponseUrl(IMG_URL) + "\" />";
-            final String SECURE_HTML = "<body>" + IMG_HTML + " " + JS_HTML + "</body>";
-            httpServer.setResponse(JS_URL, "window.loaded_js = 42;", null);
-            httpServer.setResponseBase64(IMG_URL,
-                    "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
-                    null);
             String secureUrl = httpsServer.setResponse(SECURE_URL, SECURE_HTML, null);
-
             mOnUiThread.clearSslPreferences();
 
-            mOnUiThread.setWebViewClient(new SslWebViewClient());
-
             mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
             mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
             assertEquals(1, httpsServer.getRequestCount(SECURE_URL));
-            assertEquals(0, httpServer.getRequestCount(JS_URL));
-            assertEquals(0, httpServer.getRequestCount(IMG_URL));
+            assertEquals(0, interceptClient.mInsecureJsCounter);
+            assertEquals(0, interceptClient.mInsecureImgCounter);
 
             mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
             mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
             assertEquals(2, httpsServer.getRequestCount(SECURE_URL));
-            assertEquals(1, httpServer.getRequestCount(JS_URL));
-            assertEquals(1, httpServer.getRequestCount(IMG_URL));
+            assertEquals(1, interceptClient.mInsecureJsCounter);
+            assertEquals(1, interceptClient.mInsecureImgCounter);
 
             mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
             mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
             assertEquals(3, httpsServer.getRequestCount(SECURE_URL));
-            assertEquals(1, httpServer.getRequestCount(JS_URL));
-            assertEquals(2, httpServer.getRequestCount(IMG_URL));
+            assertEquals(1, interceptClient.mInsecureJsCounter);
+            assertEquals(2, interceptClient.mInsecureImgCounter);
         } finally {
-            if (httpServer != null) {
-                httpServer.shutdown();
-            }
             if (httpsServer != null) {
                 httpsServer.shutdown();
             }
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 8da934b..944b48e 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
 LOCAL_SUITE_NAME := CTS
 LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
-LOCAL_SUITE_VERSION := 7.1_r14
+LOCAL_SUITE_VERSION := 7.1_r15
 
 LOCAL_MODULE := cts-tradefed