Merge "Increase deqp inactivity timeout to 10 mins" into mnc-dev
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 99d1d42..fb28d6d 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -309,7 +309,10 @@
     "android.assist.cts.AssistantContentViewTest",
     "android.assist.cts.ExtraAssistDataTest",
     "android.assist.cts.FocusChangeTest",
-    "android.assist.cts.ScreenshotTest"
+    "android.assist.cts.LargeViewHierarchyTest",
+    "android.assist.cts.ScreenshotTest",
+    "android.assist.cts.TextViewTest",
+    "android.assist.cts.WebViewTest"
   ],
   bug: 21668302
 }
diff --git a/tests/tests/assist/AndroidManifest.xml b/tests/tests/assist/AndroidManifest.xml
index 1bad800..a81ced2 100644
--- a/tests/tests/assist/AndroidManifest.xml
+++ b/tests/tests/assist/AndroidManifest.xml
@@ -20,7 +20,7 @@
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.BIND_VOICE_INTERACTION" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.INTERNET" />
 
     <application>
       <uses-library android:name="android.test.runner" />
@@ -33,6 +33,9 @@
               <action android:name="android.intent.action.TEST_START_ACTIVITY_LIFECYCLE" />
               <action android:name="android.intent.action.TEST_START_ACTIVITY_SCREENSHOT" />
               <action android:name="android.intent.action.TEST_START_ACTIVITY_EXTRA_ASSIST" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_TEXTVIEW" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_LARGE_VIEW_HIERARCHY" />
+              <action android:name="android.intent.action.TEST_START_ACTIVITY_WEBVIEW" />
               <category android:name="android.intent.category.LAUNCHER" />
               <category android:name="android.intent.category.DEFAULT" />
           </intent-filter>
diff --git a/tests/tests/assist/common/src/android/assist/common/Utils.java b/tests/tests/assist/common/src/android/assist/common/Utils.java
index 77d7c9e..54416b4 100644
--- a/tests/tests/assist/common/src/android/assist/common/Utils.java
+++ b/tests/tests/assist/common/src/android/assist/common/Utils.java
@@ -21,7 +21,6 @@
 
 import org.json.JSONException;
 import org.json.JSONObject;
-
 import java.util.ArrayList;
 
 public class Utils {
@@ -36,6 +35,8 @@
     public static final String ACTION_INVALIDATE = "invalidate_action";
     public static final String GET_CONTENT_VIEW_HEIGHT = ACTION_PREFIX + "GET_CONTENT_VIEW_HEIGHT";
     public static final String BROADCAST_CONTENT_VIEW_HEIGHT = ACTION_PREFIX + "VIEW_HEIGHT";
+    public static final String SCROLL_TEXTVIEW_ACTION = ACTION_PREFIX + "TEXTVIEW_SCROLL";
+    public static final String SCROLL_SCROLLVIEW_ACTION = ACTION_PREFIX + "SCROLLVIEW_SCROLL";
     public static final String TEST_ERROR = "Error In Test:";
 
     public static final String ASSIST_STRUCTURE_KEY = "assist_structure";
@@ -46,6 +47,8 @@
     public static final String COMPARE_SCREENSHOT_KEY = "compare_screenshot";
     public static final String DISPLAY_WIDTH_KEY = "display_width";
     public static final String DISPLAY_HEIGHT_KEY = "dislay_height";
+    public static final String SCROLL_X_POSITION = "scroll_x_position";
+    public static final String SCROLL_Y_POSITION = "scroll_y_position";
 
     /** Lifecycle Test intent constants */
     public static final String LIFECYCLE_PREFIX = ACTION_PREFIX + "lifecycle_";
@@ -60,9 +63,8 @@
 
     /** Flag Secure Test intent constants */
     public static final String FLAG_SECURE_HASRESUMED = ACTION_PREFIX + "flag_secure_hasResumed";
-    public static final String APP_3P_HASRESUMED = ACTION_PREFIX + "screenshot_hasResumed";
-    public static final String ASSIST_STRUCTURE_HASRESUMED = ACTION_PREFIX
-            + "assist_structure_hasResumed";
+    public static final String APP_3P_HASRESUMED = ACTION_PREFIX + "app_3p_hasResumed";
+    public static final String TEST_ACTIVITY_LOADED = ACTION_PREFIX + "test_activity_hasResumed";
 
     /** Two second timeout for getting back assist context */
     public static final int TIMEOUT_MS = 2 * 1000;
@@ -84,11 +86,19 @@
     public static final String SCREENSHOT = "SCREENSHOT";
     public static final String EXTRA_ASSIST = "EXTRA_ASSIST";
     public static final String VERIFY_CONTENT_VIEW = "VERIFY_CONTENT_VIEW";
+    public static final String TEXTVIEW = "TEXTVIEW";
+    public static final String LARGE_VIEW_HIERARCHY = "LARGE_VIEW_HIERARCHY";
+    public static final String WEBVIEW = "WEBVIEW";
     public static final String FOCUS_CHANGE = "FOCUS_CHANGE";
 
     /** Session intent constants */
     public static final String HIDE_SESSION = "android.intent.action.hide_session";
 
+    /** Stub html view to load into WebView */
+    public static final String WEBVIEW_HTML_GREETING = "Hello WebView!";
+    public static final String WEBVIEW_HTML = "<html><body><div><p>" + WEBVIEW_HTML_GREETING
+            + "</p></div></body></html>";
+
     /** Extra data to add to assist data and assist content */
     private static Bundle EXTRA_ASSIST_BUNDLE;
     private static String STRUCTURED_JSON;
@@ -140,6 +150,9 @@
             case SCREENSHOT:
             case EXTRA_ASSIST:
             case VERIFY_CONTENT_VIEW:
+            case TEXTVIEW:
+            case LARGE_VIEW_HIERARCHY:
+            case WEBVIEW:
             case FOCUS_CHANGE:
                 return "service.DelayedAssistantActivity";
             default:
@@ -153,6 +166,9 @@
     public static final ComponentName getTestAppComponent(String testCaseType) {
         switch (testCaseType) {
             case ASSIST_STRUCTURE:
+            case LARGE_VIEW_HIERARCHY:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.TestApp");
             case DISABLE_CONTEXT:
                 return new ComponentName(
                         "android.assist.testapp", "android.assist.testapp.TestApp");
@@ -168,6 +184,12 @@
             case EXTRA_ASSIST:
                 return new ComponentName(
                         "android.assist.testapp", "android.assist.testapp.ExtraAssistDataActivity");
+            case TEXTVIEW:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.TextViewActivity");
+            case WEBVIEW:
+                return new ComponentName(
+                        "android.assist.testapp", "android.assist.testapp.WebViewActivity");
             case FOCUS_CHANGE:
                 return new ComponentName(
                         "android.assist.testapp", "android.assist.testapp.FocusChangeActivity");
diff --git a/tests/tests/assist/res/layout/multiple_text_views.xml b/tests/tests/assist/res/layout/multiple_text_views.xml
new file mode 100644
index 0000000..455d5e3
--- /dev/null
+++ b/tests/tests/assist/res/layout/multiple_text_views.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical">
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <ScrollView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1">
+    <TextView
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:text="@string/text_too_large_to_fit" />
+  </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/res/layout/text_view.xml b/tests/tests/assist/res/layout/text_view.xml
new file mode 100644
index 0000000..9964ab6
--- /dev/null
+++ b/tests/tests/assist/res/layout/text_view.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical">
+    <TextView
+        android:id="@+id/text_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:focusable="false"
+        android:focusableInTouchMode="false"
+        android:scrollbars="vertical"
+        android:clickable="true"
+        android:text="@string/text_too_large_to_fit" />
+
+    <ScrollView
+        android:id="@+id/scroll_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:scrollbars="vertical"
+            android:text="@string/text_too_large_to_fit" />
+    </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/res/layout/webview.xml b/tests/tests/assist/res/layout/webview.xml
new file mode 100644
index 0000000..bdb8082
--- /dev/null
+++ b/tests/tests/assist/res/layout/webview.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <WebView
+        android:id="@+id/webview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </WebView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/res/values/strings.xml b/tests/tests/assist/res/values/strings.xml
index a84c743..8170d70 100644
--- a/tests/tests/assist/res/values/strings.xml
+++ b/tests/tests/assist/res/values/strings.xml
@@ -15,6 +15,270 @@
 -->
 <resources>
     <string name="welcome">Hello there!</string>
-     <string name="testAppTitle">Assist Structure Test Activity</string>
-     <string name="screenshotActivityTitle">Screenshot Test Activity</string>
+    <string name="testAppTitle">Assist Structure Test Activity</string>
+    <string name="screenshotActivityTitle">Screenshot Test Activity</string>
+    <string name="textViewActivityTitle">TextView Test Activity</string>
+    <string name="webViewActivityTitle">WebView Test Activity</string>
+    <string name="text_too_large_to_fit">❤ ☀ ☆ ☂ ☻ ♞ ☯ ☭ ☢ € →Hello هتاف للترحيب שלום
+        përshëndetje Добры дзень 您好 হ্যালো здравей მიესალმები Χαίρετε હેલો नमस्ते Nnọọ こんにちは ಹಲೋ
+        Сәлеметсіз бе ជំរាបសួរ 안녕하세요 ສະບາຍດີ ഹലോ हॅलो Сайн байна уу नमस्ते سلامהעלא ہیلو
+        မင်္ဂလာပါ ਸਤ ਸ੍ਰੀ ਅਕਾਲ Здравствуйте здраво ආයුබෝවන් ஹலோ హలో สวัสดี Pẹlẹ o
+        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+        convallis nunc et vestibulum. Sed et consequat quam, blandit varius tortor. Curabitur
+        accumsan nulla lectus, placerat condimentum odio elementum vel. Nulla erat ex, accumsan ut
+        enim sagittis, scelerisque efficitur ante. Nullam quis orci nec magna maximus malesuada ac
+        id sem. Nam sagittis erat risus, a accumsan neque congue sit amet. Nullam risus velit,
+        faucibus eget scelerisque et, maximus eget arcu. Sed porta sed libero ac imperdiet.
+
+        Nulla sem lectus, ullamcorper id dui vel, rutrum interdum augue. Proin aliquam nisi vitae
+        hendrerit tempor. Mauris porttitor velit et egestas feugiat. Vivamus eu dapibus libero,
+        quis fringilla urna. Suspendisse non turpis dui. Vivamus facilisis diam vitae est auctor
+        luctus. Etiam quis lectus viverra, interdum turpis eu, aliquam sem. Nulla vulputate lacinia
+        nisi a dictum. Cras faucibus vitae tortor at ullamcorper. Quisque sit amet sapien maximus,
+        ornare nisi non, imperdiet magna. Vestibulum tempor metus ac mi ultrices dapibus.
+
+        Suspendisse potenti. Mauris pellentesque lacinia tristique. Pellentesque vel dui quis sem
+        lacinia imperdiet feugiat vitae sem. Proin a arcu magna. Sed quis augue eu mi accumsan
+        pellentesque pretium in leo. Duis euismod purus mauris, ac tempor erat auctor non. Quisque
+        bibendum est pulvinar ex dapibus, ac tincidunt nibh tempus. Mauris sodales sem id purus
+        commodo iaculis. Pellentesque a quam dapibus, vehicula lectus at, tincidunt arcu. In
+        placerat porttitor urna quis consequat. Nullam feugiat nisl sed urna hendrerit, sed
+        elementum massa iaculis. Fusce sit amet turpis hendrerit, varius lorem sed, luctus mi.
+        Phasellus sit amet ex orci. Duis scelerisque nisl quis efficitur maximus. Curabitur vitae
+        accumsan nunc, eget varius nisi.
+
+        Fusce efficitur malesuada luctus. Aliquam dapibus tortor sit amet purus semper, sit amet
+        pretium lorem feugiat. Maecenas gravida sed arcu et placerat. Nulla facilisi. Cras placerat
+        rutrum mi, in rutrum mauris maximus at. Mauris eu suscipit ante. Nullam pharetra egestas
+        diam a viverra. Donec sem turpis, tempor malesuada est vel, blandit accumsan magna. In
+        iaculis velit in efficitur hendrerit. Nulla facilisi. Curabitur eget ligula lorem. Sed sit
+        amet dolor ut ligula malesuada condimentum. Phasellus molestie augue eget libero commodo,
+        vel blandit ex blandit.
+
+        Morbi cursus tortor ante, et tempus nisi tempus et. Suspendisse quis gravida diam. Aliquam
+        efficitur dolor sit amet sollicitudin varius. Etiam libero purus, ornare nec nulla vel,
+        ullamcorper blandit nisl. Sed vel consequat diam, id placerat sem. Donec quis elementum
+        urna. In posuere bibendum nunc, in condimentum justo blandit ac. Quisque enim lorem,
+        gravida at purus at, sollicitudin imperdiet erat. Ut consectetur rutrum ante, et pretium
+        odio iaculis a. Nullam a nibh vulputate, volutpat lectus eu, pellentesque felis. Nam
+        vehicula suscipit diam nec convallis. Quisque congue maximus sem, sit amet hendrerit leo
+        tempor et.
+
+        Nam eu consequat dui. Sed semper dignissim mattis. Integer tortor eros, tempor in lectus a,
+        lobortis aliquam dolor. Phasellus at sagittis magna. Nulla eleifend orci ac urna auctor,
+        sit amet luctus urna vulputate. Nulla venenatis venenatis erat ac finibus. Etiam
+        ullamcorper elementum suscipit. Morbi nec velit non mauris porta finibus. Nullam in
+        sagittis odio. Praesent eget nisl ut mauris vestibulum feugiat. Sed vulputate at elit et
+        cursus. Praesent viverra erat blandit nunc egestas, vel feugiat ex condimentum. Class
+        aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
+        Nulla fermentum mattis urna, non gravida eros vestibulum et. Fusce porttitor augue turpis,
+        sit amet aliquam augue sodales non. Nunc neque odio, sagittis sed gravida euismod, commodo
+        at libero. Donec porttitor pulvinar neque vitae lobortis. Aliquam accumsan velit nec sapien
+        placerat egestas. Aliquam at tincidunt massa, et dignissim justo. Donec sapien ante, rutrum
+        et tristique a, commodo a massa.
+
+        Nunc placerat lobortis magna, et molestie lacus semper porta. Lorem ipsum dolor sit amet,
+        consectetur adipiscing elit. Phasellus ac ligula dui. Duis ultrices viverra eros fermentum
+        finibus. Integer ultrices, felis in accumsan volutpat, mi ligula hendrerit nunc, nec
+        accumsan mauris tellus sit amet metus. Ut pharetra enim et sapien sollicitudin, nec
+        ultricies urna pharetra. Morbi non tortor nec dui feugiat rutrum. Aliquam malesuada sodales
+        risus, sed congue nunc accumsan vitae. Etiam nunc magna, tempus non suscipit eu, feugiat ut
+        nibh. Maecenas et libero ut nisl pellentesque tempor nec vel quam. Etiam sem ligula,
+        ullamcorper non dolor a, viverra placerat nulla. Nullam dictum commodo dui, sed ultrices
+        enim sagittis eget. Morbi non consectetur lectus. In gravida, augue vitae pulvinar
+        molestie, ligula orci vulputate ex, at bibendum urna felis nec nibh. Sed nisl nunc, iaculis
+        at augue venenatis, fringilla accumsan velit. Curabitur nec augue porttitor, rutrum nisi
+        vitae, elementum orci.
+
+        Vestibulum eu tortor iaculis, dignissim velit quis, rhoncus dolor. Donec et tincidunt
+        nulla. Duis faucibus auctor erat ac ultricies. In a fermentum mi. Fusce vitae mi id sem
+        interdum tincidunt. Nulla hendrerit orci turpis, in maximus elit mollis eget. Aliquam erat
+        volutpat. Phasellus mattis est nibh, ut scelerisque ligula egestas eu. Ut molestie orci a
+        malesuada tempor. Sed tempus arcu id orci gravida faucibus. Vivamus ac lacinia neque, at
+        vehicula magna.
+
+        Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+        Nullam aliquam, justo scelerisque egestas sodales, purus odio posuere arcu, ac ultrices
+        nunc felis non massa. Aliquam vulputate ipsum sed aliquet auctor. In pulvinar, eros sit
+        amet ultricies tristique, lacus ipsum scelerisque eros, nec vestibulum est lectus quis
+        lorem. Pellentesque ac augue ut eros mattis viverra vitae ut lacus. Phasellus imperdiet
+        efficitur elit eget tincidunt. Donec sodales metus at dolor pulvinar, at gravida nibh
+        facilisis. Sed nec tellus luctus, cursus lacus sed, euismod orci. Maecenas sit amet leo
+        orci. Nulla non leo non mi eleifend consequat sit amet vitae dui. Sed gravida gravida
+        justo, tincidunt ultrices justo semper vitae. Fusce at nisi nisl. Morbi molestie quis justo
+        a convallis. Curabitur massa lacus, feugiat quis mauris ac, malesuada viverra est.
+
+        Phasellus bibendum faucibus velit, ac scelerisque velit tincidunt eu. Curabitur quis
+        suscipit erat, ac feugiat odio. Nullam et sapien et nibh maximus posuere. Vivamus faucibus
+        justo eget dictum sollicitudin. Etiam at leo eget elit facilisis lobortis. Maecenas
+        bibendum tortor non erat pretium dignissim. Fusce id imperdiet augue. Suspendisse dignissim
+        magna vel odio viverra varius. Maecenas suscipit ante et lorem sodales vehicula. Quisque
+        vel magna id sem suscipit iaculis. Etiam in elementum risus.
+
+        Suspendisse odio nisi, pharetra et purus sit amet, placerat lobortis diam. Phasellus enim
+        nunc, posuere sed porta in, ornare eu ipsum. Phasellus imperdiet porta neque, vitae dapibus
+        tellus feugiat eget. Nulla sodales leo ac efficitur luctus. Vivamus eget ipsum quis ante
+        pulvinar blandit. Vestibulum a justo convallis justo elementum viverra ut sit amet nisl.
+        Suspendisse eget augue fermentum, sagittis risus a, rhoncus elit. Vestibulum in maximus
+        tortor, non vestibulum libero. Nunc accumsan neque a nisl dapibus, id laoreet neque congue.
+        Pellentesque sapien odio, fringilla non nulla nec, varius placerat diam. Aliquam
+        consectetur neque eu ipsum posuere, nec dignissim sem faucibus. Donec sit amet tempor
+        sapien. Nam at libero vel lorem dapibus ultrices a vel augue. Nunc facilisis justo ante,
+        mollis tristique velit aliquet quis. Mauris consectetur odio at urna bibendum aliquam.
+
+           Nullam lectus orci, hendrerit ut ultrices in, dapibus pellentesque nibh. Aliquam arcu
+        metus, lobortis vel dignissim id, tempus ut ante. Integer vitae ante augue. In hac habitasse
+        platea dictumst. Vestibulum in tellus ante. Cras nisi tellus, congue ac velit quis, rhoncus
+        ornare ligula. Sed facilisis gravida pellentesque. Praesent id ultrices orci, ac ultricies
+        arcu. Donec at ante quis augue faucibus congue. Donec mattis quam dui, ut vestibulum orci
+        tempor mattis. Phasellus in quam id tortor varius ullamcorper ac ac ante. Proin cursus
+        accumsan sem, vel finibus lectus eleifend ut. Donec efficitur feugiat diam id ultricies. In
+        quis euismod nisi. Vestibulum eget viverra sapien. Donec scelerisque nec elit vel viverra.
+
+           Sed mi urna, rutrum quis augue vel, aliquet placerat diam. Proin faucibus in odio et
+        consequat. Proin ut ex in mauris eleifend efficitur. Praesent ullamcorper sollicitudin urna,
+        sed mollis elit hendrerit non. Duis leo lorem, efficitur eu auctor sit amet, scelerisque
+        scelerisque magna. Mauris eget massa auctor, viverra arcu a, elementum nibh. Sed
+        pellentesque, nulla sed condimentum posuere, tortor metus congue sem, nec placerat neque
+        magna vitae purus.
+
+           Etiam at risus vitae sapien aliquam condimentum. Vestibulum id libero placerat purus
+        vehicula consectetur. Pellentesque sapien sapien, posuere at pulvinar at, ultrices sed est.
+        Maecenas nec condimentum ante. Aenean volutpat, ex condimentum hendrerit hendrerit, quam
+        nisl  pharetra nibh, vitae bibendum nisl odio vel lacus. Morbi mi tellus, bibendum id mauris
+        eu,  facilisis volutpat turpis. Maecenas rutrum convallis felis. Quisque eget feugiat felis.
+        Duis pellentesque iaculis massa ut facilisis. Donec nec commodo magna. Integer aliquet orci
+        a odio eleifend elementum. Quisque molestie, urna ut molestie eleifend, odio neque maximus
+        enim, eget viverra metus lectus eget quam. Fusce nec urna ac neque bibendum aliquam vel quis
+        dui. Fusce ac quam consequat, feugiat leo vitae, auctor felis.
+
+           Sed ac metus mauris. Sed sed velit ut tortor aliquam vestibulum at eu arcu. Etiam eu
+        posuere lacus. Maecenas id lacus quis sem mollis sodales. Quisque justo sapien, vulputate ac
+        mi ut, congue vestibulum orci. Donec euismod erat rutrum, laoreet urna sed, accumsan purus.
+        Donec eu quam a sapien condimentum accumsan. Sed at tellus lorem. Curabitur bibendum, arcu
+        sit amet finibus sodales, mi sem finibus sem, eget scelerisque tellus neque vel urna.
+        Suspendisse eu augue nec erat suscipit luctus sed non metus.
+
+           Suspendisse porttitor ex ipsum. Pellentesque tristique eros sed pharetra porttitor.
+        Quisque ut elit vehicula, aliquet est nec, faucibus tellus. Donec ex augue, congue eu
+        dignissim  maximus, vestibulum at purus. Nulla quam enim, laoreet sit amet molestie vel,
+        dapibus nec tortor. Sed interdum massa ac orci gravida, vel viverra lacus lacinia. Donec
+        nisl lacus, fermentum at faucibus ac, consequat ut nibh. Praesent laoreet est augue, vitae
+        maximus dui efficitur sit amet. Cras ipsum tellus, tincidunt at volutpat non, tincidunt ut
+        elit. Morbi commodo sagittis gravida. Pellentesque sed ante massa. Phasellus a turpis non
+        turpis cursus consequat sed nec tortor. Proin et augue elit.
+
+           Duis finibus sem commodo rutrum pulvinar. In sollicitudin ante magna, vel facilisis
+        tellus fringilla vel. Nam purus ex, tincidunt eget varius at, euismod nec elit. Curabitur
+        consequat nulla vel nisi iaculis, ut mattis odio congue. Nulla et mollis tortor, a maximus
+        justo. Donec semper eros sed nunc rhoncus condimentum. Donec nibh purus, interdum non lectus
+        id, porta convallis eros.
+
+           Sed hendrerit, dui non sagittis sollicitudin, enim ex imperdiet sapien, et maximus lorem
+        dolor a enim. Nulla risus nisl, vestibulum at ornare posuere, congue in felis. Duis sagittis
+        id diam a varius. Donec viverra eu orci sodales commodo. Cras metus tortor, sodales vitae
+        auctor non, scelerisque a ante. Quisque sodales nisi libero, ut lobortis enim suscipit ut.
+        Cras mi ipsum, maximus non bibendum sit amet, pharetra quis ipsum. Vestibulum venenatis, odi
+        at hendrerit pretium, tellus diam auctor justo, non posuere quam mauris id nisl. Nam dolor
+        nibh, molestie et lectus et, scelerisque porta elit. Vestibulum viverra condimentum auctor.
+        In eros tortor, convallis sed quam eu, ultrices malesuada purus. Integer lorem quam,
+        ultricies at est consectetur, sagittis porttitor eros. Proin non risus vitae lacus
+        consectetur malesuada non pulvinar justo. Aliquam mollis nisi nunc, sit amet vulputate metus
+        sollicitudin vel.
+
+           Quisque auctor varius fermentum. Praesent mollis justo sit amet est consectetur, in
+        volutpat tellus mollis. Aenean at bibendum eros, at finibus nibh. Phasellus nec mi sem.
+        Mauris pellentesque dui sit amet lobortis aliquam. Ut nec massa at urna aliquam gravida vel
+        in magna. Donec consectetur sapien magna, a auctor sapien placerat eu.
+
+           Pellentesque aliquet ante sed lacus gravida rutrum. Maecenas euismod varius felis, nec
+        tempus metus tempus et. Nam convallis augue a massa scelerisque, vel pharetra dolor
+        scelerisque. Fusce porttitor mi a magna rutrum condimentum. Aliquam fermentum at turpis at
+        auctor. Nulla ut suscipit dui. Donec rutrum viverra aliquam. Donec elementum nisl sapien, ac
+        blandit risus porta facilisis. Proin tellus dolor, ornare vel magna sit amet, maximus
+        volutpat felis. Aenean euismod aliquet purus, at finibus nunc elementum eu. Ut faucibus
+        ullamcorper consectetur. Aenean egestas arcu id mauris elementum, at sollicitudin est
+        congue. Sed a odio mattis, sollicitudin erat ut, tristique dolor. Aliquam luctus risus quis
+        tellus semper, a vestibulum nulla viverra.
+
+           Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
+        himenaeos. Vestibulum sit amet nisi felis. Praesent condimentum consequat lacus pulvinar
+        imperdiet. Praesent vel condimentum quam. Maecenas eu aliquet odio. Vestibulum sed nulla
+        mattis lacus porta bibendum a ac eros. Nunc porttitor sagittis laoreet. Duis porta eros at
+        congue tristique. Pellentesque quis fringilla neque, a hendrerit tellus. Pellentesque ac
+        nibh ac tellus pulvinar porttitor et in est. Integer blandit lorem libero, eu pulvinar
+        tellus posuere eget. Vivamus pretium nulla ligula, ut dapibus massa fringilla in.
+        Suspendisse consectetur sem non elit porta, id pellentesque erat dapibus. Quisque ex mi,
+        tempus et hendrerit nec, gravida quis odio. Ut at mi in leo scelerisque venenatis.
+
+           Ut sed tellus in risus tincidunt tempor ut at arcu. Maecenas ut convallis justo. In
+        rutrum urna eu massa rhoncus, eget condimentum augue vehicula. Nullam eget placerat erat.
+        Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+        Aenean at volutpat orci, a lobortis dolor. Sed consequat facilisis interdum. Fusce libero
+        neque, fringilla in congue a, vehicula rutrum ipsum. Nam ornare placerat vestibulum. Proin
+        nec orci velit. Pellentesque scelerisque gravida diam, ut tristique libero tempus eu. Nam
+        semper lacus nec nulla volutpat imperdiet non eget tortor. Sed et pellentesque ligula.
+
+           Aenean a dolor dolor. Curabitur ut placerat lacus, sit amet aliquet orci. Aliquam erat
+        volutpat. Cras mollis sit amet lectus ornare pretium. Vestibulum fringilla orci vel est
+        iaculis, at mattis quam condimentum. Vivamus semper elit consectetur lectus gravida, in
+        sollicitudin mi fringilla. Donec eget lorem in orci blandit aliquam. Pellentesque libero
+        tellus, dignissim id augue et, vulputate viverra nisl. Cum sociis natoque penatibus et
+        magnis dis parturient montes, nascetur ridiculus mus. Donec ac vulputate metus, eu suscipit
+        sem. Donec placerat, nulla at sodales hendrerit, orci tortor vestibulum purus, non pharetra
+        nulla purus posuere arcu.
+
+           Quisque feugiat elit sem, ac interdum diam pharetra nec. Curabitur sem libero, vulputate
+        eu libero vitae, volutpat facilisis ligula. Aenean maximus erat laoreet, interdum ante in,
+        ultrices nisi. Nullam nec efficitur sapien. Integer feugiat et tortor ac bibendum. Donec a
+        scelerisque tortor. Cras quis viverra diam, vitae viverra ipsum. Aliquam ultrices neque sem,
+        congue sodales elit tempus sit amet. Pellentesque habitant morbi tristique senectus et netus
+        et malesuada fames ac turpis egestas. Sed dignissim ipsum eget diam rhoncus, ut finibus
+        nulla pretium. Morbi suscipit nibh vel nisl posuere molestie. Maecenas posuere turpis et
+        rutrum consectetur. Morbi venenatis arcu non gravida vulputate. Vivamus auctor tellus
+        ullamcorper ligula vestibulum cursus. Nunc gravida sit amet nisl quis facilisis.
+
+           Praesent ut justo vestibulum, accumsan mi et, feugiat purus. Nullam pulvinar iaculis
+        pharetra. Aliquam pulvinar risus sit amet elit suscipit tincidunt. In hac habitasse platea
+        dictumst. Etiam eget velit ac magna lacinia efficitur. Vestibulum ante ipsum primis in
+        faucibus orci luctus et ultrices posuere cubilia Curae; Cras volutpat tempus sollicitudin.
+        Ut et ante elit.
+
+           Sed ac tortor justo. Fusce sed metus libero. Duis sagittis tortor ac ante sollicitudin,
+        nec efficitur nibh euismod. Donec porttitor cursus quam, in aliquam lorem feugiat ut.
+        Aliquam tempor lacus eu feugiat feugiat. Nunc pulvinar, libero at auctor commodo, metus diam
+        commodo lorem, in feugiat elit ex non ligula. Quisque at vestibulum sapien, nec facilisis
+        neque. Aenean luctus, arcu ut rhoncus luctus, est massa rhoncus mauris, nec luctus urna sem
+        quis massa. Nam elit felis, congue et ligula eget, ultricies tincidunt erat. Vivamus
+        eleifend no dui ac dictum. In nulla justo, pulvinar ut tristique sed, congue et orci.
+
+           Quisque imperdiet mi lectus, ac scelerisque augue posuere ut. Duis non pulvinar ipsum,
+        finibus risus. Donec ullamcorper nisl at sodales lobortis. Mauris neque leo, vestibulum sit
+        amet placerat vel, aliquet vel sapien. Morbi massa tellus, scelerisque quis nisl in, feugiat
+        posuere augue. Aenean congue sem ut ipsum vulputate rhoncus vitae at eros. Maecenas in velit
+        orci pellentesque lobortis ac at felis. Vestibulum odio quam, lacinia dapibus ornare eu,
+        vulputate a eros. Curabitur eleifend ornare tellus, non sollicitudin justo viverra in. Sed
+        sodales neque et lacus semper, in pharetra est consequat. Nunc vehicula volutpat lectus, sit
+        amet scelerisque nisi. Aenean sollicitudin, sem at ultricies efficitur, eros metus
+        nisl, et fringilla felis lacus non orci. Praesent eros libero, finibus in purus id,
+        tempor ipsum. Donec suscipit libero velit. Aliquam quis diam pharetra, cursus ipsum in,
+        gravida metus. Maecenas ultrices ligula a ullamcorper scelerisque.
+
+           Donec tincidunt felis turpis, id venenatis neque convallis in. Proin euismod ligula nec
+        urna vulputate, sed elementum mauris ultrices. Ut efficitur sem vel mi vestibulum placerat.
+        Sed fermentum lacus nec metus dictum, a commodo quam fermentum. Sed vel vulputate magna.
+        Integer convallis nisi sit amet mi lobortis pellentesque. In egestas porttitor elit eu
+        scelerisque. Suspendisse eleifend vel enim quis tincidunt. Sed placerat risus et pretium
+        porttitor. Nam justo mi, cursus eu pellentesque vel, bibendum ut nisl. Nulla condimentum
+        lorem, non sagittis lorem volutpat vitae. Mauris nec libero lorem. Vestibulum lacus ex,
+        vulputate non massa vitae, pellentesque vestibulum dolor.
+
+           Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+        Suspendisse vitae erat nisl. Vestibulum elit ante, semper et semper sit amet, fringilla
+        sapien. Morbi ac nisi sit amet turpis tincidunt mattis ac eget nisl. Nunc a venenatis quam,
+        facilisis maximus odio. Aliquam erat volutpat. Maecenas leo enim, ornare a magna quis,
+        venenatis ornare nulla. Aliquam venenatis nibh et elit tincidunt, ut egestas lorem finibus.
+        Integer iaculis dolor sed enim blandit vestibulum. Nullam vel libero ultricies, sagittis
+        tortor non, molestie eros.</string>
 </resources>
diff --git a/tests/tests/assist/service/AndroidManifest.xml b/tests/tests/assist/service/AndroidManifest.xml
index eea1249..354d771 100644
--- a/tests/tests/assist/service/AndroidManifest.xml
+++ b/tests/tests/assist/service/AndroidManifest.xml
@@ -47,6 +47,8 @@
               <action android:name="android.intent.action.START_TEST_FLAG_SECURE" />
               <action android:name="android.intent.action.START_TEST_SCREENSHOT" />
               <action android:name="android.intent.action.START_TEST_EXTRA_ASSIST" />
+              <action android:name="android.intent.action.START_TEST_TEXTVIEW" />
+              <action android:name="android.intent.action.START_TEST_LARGE_VIEW_HIERARCHY" />
               <category android:name="android.intent.category.DEFAULT" />
           </intent-filter>
       </activity>
diff --git a/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
index b35e43b..4c1b1f3 100644
--- a/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistStructureTest.java
@@ -67,7 +67,7 @@
         }
         mReceiver = new AssistStructureTestBroadcastReceiver();
         IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.ASSIST_STRUCTURE_HASRESUMED);
+        filter.addAction(Utils.APP_3P_HASRESUMED);
         filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
         mContext.registerReceiver(mReceiver, filter);
     }
@@ -96,7 +96,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
-            if (action.equals(Utils.ASSIST_STRUCTURE_HASRESUMED)) {
+            if (action.equals(Utils.APP_3P_HASRESUMED)) {
                 if (mHasResumedLatch != null) {
                     mHasResumedLatch.countDown();
                 }
diff --git a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
index ecbd435..46fb8d9 100644
--- a/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
+++ b/tests/tests/assist/src/android/assist/cts/AssistTestBase.java
@@ -35,6 +35,7 @@
 import android.graphics.BitmapFactory;
 import android.graphics.Color;
 import android.graphics.Point;
+import android.graphics.Rect;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.test.ActivityInstrumentationTestCase2;
@@ -44,8 +45,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.webkit.WebView;
+import android.widget.EditText;
 import android.widget.TextView;
 
+import java.lang.Math;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -175,9 +180,9 @@
             mContext.unregisterReceiver(mReceiver);
         }
         mReceiver = new TestResultsReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Utils.BROADCAST_ASSIST_DATA_INTENT);
-        mContext.registerReceiver(mReceiver, filter);
+        mContext.registerReceiver(mReceiver,
+                new IntentFilter(Utils.BROADCAST_ASSIST_DATA_INTENT));
+
         if (!mLatch.await(Utils.getAssistDataTimeout(mTestName), TimeUnit.MILLISECONDS)) {
             fail("Fail to receive broadcast in " + Utils.getAssistDataTimeout(mTestName) + "msec");
         }
@@ -198,26 +203,43 @@
 
         if ((mAssistContent == null) != isContentNull) {
             fail(String.format("Should %s have been null - AssistContent: %s",
-                    isContentNull? "":"not", mAssistContent));
+                    isContentNull ? "" : "not", mAssistContent));
         }
 
         if ((mAssistStructure == null) != isStructureNull) {
             fail(String.format("Should %s have been null - AssistStructure: %s",
-                isStructureNull ? "" : "not", mAssistStructure));
+                    isStructureNull ? "" : "not", mAssistStructure));
         }
 
         if ((mAssistBundle == null) != isBundleNull) {
             fail(String.format("Should %s have been null - AssistBundle: %s",
-                    isBundleNull? "":"not", mAssistBundle));
+                    isBundleNull ? "" : "not", mAssistBundle));
         }
 
         if (mScreenshot == isScreenshotNull) {
             fail(String.format("Should %s have been null - Screenshot: %s",
-                    isScreenshotNull? "":"not", mScreenshot));
+                    isScreenshotNull ? "":"not", mScreenshot));
         }
     }
 
     /**
+     * Sends a broadcast with the specified scroll positions to the test app.
+     */
+    protected void scrollTestApp(int scrollX, int scrollY, boolean scrollTextView,
+            boolean scrollScrollView) {
+        mTestActivity.scrollText(scrollX, scrollY, scrollTextView, scrollScrollView);
+        Intent intent = null;
+        if (scrollTextView) {
+            intent = new Intent(Utils.SCROLL_TEXTVIEW_ACTION);
+        } else if (scrollScrollView) {
+            intent = new Intent(Utils.SCROLL_SCROLLVIEW_ACTION);
+        }
+        intent.putExtra(Utils.SCROLL_X_POSITION, scrollX);
+        intent.putExtra(Utils.SCROLL_Y_POSITION, scrollY);
+        mContext.sendBroadcast(intent);
+    }
+
+    /**
      * Verifies the view hierarchy of the backgroundApp matches the assist structure.
      *
      * @param backgroundApp ComponentName of app the assistant is invoked upon
@@ -226,7 +248,7 @@
     protected void verifyAssistStructure(ComponentName backgroundApp, boolean isSecureWindow) {
         // Check component name matches
         assertEquals(backgroundApp.flattenToString(),
-            mAssistStructure.getActivityComponent().flattenToString());
+                mAssistStructure.getActivityComponent().flattenToString());
 
         Log.i(TAG, "Traversing down structure for: " + backgroundApp.flattenToString());
         mView = mTestActivity.findViewById(android.R.id.content).getRootView();
@@ -288,9 +310,10 @@
                         + ((ViewGroup) parentView).getChildAt(childInt).getClass().getName());
             }
         }
+        String parentViewId = null;
         if (parentView.getId() > 0) {
-            Log.i(TAG, "View ID: "
-                    + mTestActivity.getResources().getResourceEntryName(parentView.getId()));
+            parentViewId = mTestActivity.getResources().getResourceEntryName(parentView.getId());
+            Log.i(TAG, "View ID: " + parentViewId);
         }
 
         Log.i(TAG, "parentNode is of type: " + parentNode.getClassName());
@@ -299,7 +322,9 @@
                     "nodechild" + nodeInt + " is of type: "
                     + parentNode.getChildAt(nodeInt).getClassName());
         }
-            Log.i(TAG, "Node ID: " + parentNode.getIdEntry());
+        Log.i(TAG, "Node ID: " + parentNode.getIdEntry());
+
+        assertEquals("IDs do not match", parentViewId, parentNode.getIdEntry());
 
         int numViewChildren = 0;
         int numNodeChildren = 0;
@@ -309,30 +334,56 @@
         numNodeChildren = parentNode.getChildCount();
 
         if (isSecureWindow) {
+            assertTrue("ViewNode property isAssistBlocked is false", parentNode.isAssistBlocked());
             assertEquals("Secure window should only traverse root node.", 0, numNodeChildren);
             isSecureWindow = false;
-            return;
+        } else if (parentNode.getClassName().equals("android.webkit.WebView")) {
+            // WebView will also appear to have no children while the node does, traverse node
+            assertTrue("AssistStructure returned a WebView where the view wasn't one",
+                    parentView instanceof WebView);
+
+            boolean textInWebView = false;
+
+            for (int i = numNodeChildren - 1; i >= 0; i--) {
+               textInWebView |= traverseWebViewForText(parentNode.getChildAt(i));
+            }
+            assertTrue("Did not find expected strings inside WebView", textInWebView);
         } else {
             assertEquals("Number of children did not match.", numViewChildren, numNodeChildren);
-        }
 
-        verifyViewProperties(parentView, parentNode);
+            verifyViewProperties(parentView, parentNode);
 
-        if (parentView instanceof ViewGroup) {
-            parentGroup = (ViewGroup) parentView;
+            if (parentView instanceof ViewGroup) {
+                parentGroup = (ViewGroup) parentView;
 
-            // TODO: set a max recursion level
-            for (int i = numNodeChildren - 1; i >= 0; i--) {
-                View childView = parentGroup.getChildAt(i);
-                ViewNode childNode = parentNode.getChildAt(i);
+                // TODO: set a max recursion level
+                for (int i = numNodeChildren - 1; i >= 0; i--) {
+                    View childView = parentGroup.getChildAt(i);
+                    ViewNode childNode = parentNode.getChildAt(i);
 
-                // if isSecureWindow, should not have reached this point.
-                assertFalse(isSecureWindow);
-                traverseViewAndStructure(childView, childNode, isSecureWindow);
+                    // if isSecureWindow, should not have reached this point.
+                    assertFalse(isSecureWindow);
+                    traverseViewAndStructure(childView, childNode, isSecureWindow);
+                }
             }
         }
     }
 
+    /** 
+     * Return true if the expected strings are found in the WebView, else fail.
+     */
+    private boolean traverseWebViewForText(ViewNode parentNode) {
+        boolean textFound = false;
+        if (parentNode.getText() != null 
+                && parentNode.getText().toString().equals(Utils.WEBVIEW_HTML_GREETING)) {
+            return true;
+        }
+        for (int i = parentNode.getChildCount() - 1; i >= 0; i--) {
+            textFound |= traverseWebViewForText(parentNode.getChildAt(i));
+        }
+        return textFound;
+    }
+
     /**
      * Compare view properties of the view hierarchy with that reported in the assist structure.
      */
@@ -357,21 +408,43 @@
             Log.i(TAG, "view text: " + ((TextView) parentView).getText());
         }
 
-        assertEquals("Scroll X does not match.",
-                parentView.getScrollX(), parentNode.getScrollX());
 
-        assertEquals("Scroll Y does not match.",
-                parentView.getScrollY(), parentNode.getScrollY());
-
-        assertEquals("Heights do not match.", parentView.getHeight(),
-                parentNode.getHeight());
-
+        assertEquals("Scroll X does not match.", parentView.getScrollX(), parentNode.getScrollX());
+        assertEquals("Scroll Y does not match.", parentView.getScrollY(), parentNode.getScrollY());
+        assertEquals("Heights do not match.", parentView.getHeight(), parentNode.getHeight());
         assertEquals("Widths do not match.", parentView.getWidth(), parentNode.getWidth());
 
-        // TODO: handle unicode/i18n
         if (parentView instanceof TextView) {
-            assertEquals("Text in TextView does not match.",
-                    ((TextView) parentView).getText().toString(), parentNode.getText());
+            if (parentView instanceof EditText) {
+                assertEquals("Text selection start does not match",
+                    ((EditText)parentView).getSelectionStart(), parentNode.getTextSelectionStart());
+                assertEquals("Text selection end does not match",
+                        ((EditText)parentView).getSelectionEnd(), parentNode.getTextSelectionEnd());
+            }
+            TextView textView = (TextView) parentView;
+            assertEquals(textView.getTextSize(), parentNode.getTextSize());
+            String viewString = textView.getText().toString();
+            String nodeString = parentNode.getText().toString();
+
+            if (parentNode.getScrollX() == 0 && parentNode.getScrollY() == 0) {
+                Log.i(TAG, "Verifying text within TextView at the beginning");
+                Log.i(TAG, "view string: " + viewString);
+                Log.i(TAG, "node string: " + nodeString);
+                assertTrue("String length is unexpected: original string - " + viewString.length() +
+                                ", string in AssistData - " + nodeString.length(),
+                        viewString.length() >= nodeString.length());
+                assertTrue("Expected a longer string to be shown. expected: "
+                                + Math.min(viewString.length(), 30) + " was: " + nodeString
+                                .length(),
+                        nodeString.length() >= Math.min(viewString.length(), 30));
+                for (int x = 0; x < parentNode.getText().length(); x++) {
+                    assertEquals("Char not equal at index: " + x,
+                            ((TextView) parentView).getText().toString().charAt(x),
+                            parentNode.getText().charAt(x));
+                }
+            } else if (parentNode.getScrollX() == parentView.getWidth()) {
+
+            }
         } else {
             assertNull(parentNode.getText());
         }
diff --git a/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java b/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java
new file mode 100644
index 0000000..bc2ab80
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/LargeViewHierarchyTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ *  Test that the AssistStructure returned is properly formatted.
+ */
+
+public class LargeViewHierarchyTest extends AssistTestBase {
+    private static final String TAG = "LargeViewHierarchyTest";
+    private static final String TEST_CASE_TYPE = Utils.LARGE_VIEW_HIERARCHY;
+
+    private BroadcastReceiver mReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+    private CountDownLatch mReadyLatch = new CountDownLatch(1);
+
+    public LargeViewHierarchyTest() {
+        super();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+            mReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new LargeViewTestBroadcastReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.APP_3P_HASRESUMED);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    public void testTextView() throws Exception {
+        mTestActivity.start3pApp(TEST_CASE_TYPE);
+        mTestActivity.startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady(mReadyLatch);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistDataNullness(false, false, false, false);
+
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
+                false /*FLAG_SECURE set*/);
+    }
+
+    private class LargeViewTestBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) && mReadyLatch != null) {
+                mReadyLatch.countDown();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/src/android/assist/cts/LifecycleTest.java b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
index 0a23bfb..c886b74 100644
--- a/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
+++ b/tests/tests/assist/src/android/assist/cts/LifecycleTest.java
@@ -112,7 +112,7 @@
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if (action.equals(action_hasResumed) && mHasResumedLatch != null) {
-                    mHasResumedLatch.countDown();
+                mHasResumedLatch.countDown();
             } else if (action.equals(action_onPause) && mActivityLifecycleLatch != null) {
                 mActivityLifecycleLatch.countDown();
             } else if (action.equals(action_onStop) && mActivityLifecycleLatch != null) {
diff --git a/tests/tests/assist/src/android/assist/cts/TestStartActivity.java b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
index 601b101..fa191ae 100644
--- a/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
+++ b/tests/tests/assist/src/android/assist/cts/TestStartActivity.java
@@ -28,23 +28,53 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ScrollView;
 import android.widget.TextView;
 
+import java.lang.Override;
+
 public class TestStartActivity extends Activity {
     static final String TAG = "TestStartActivity";
 
+    private ScrollView mScrollView;
+    private TextView mTextView;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, " in onCreate");
-
         // Set the respective view we want compared with the test activity
-        String testCaseName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
-        switch (testCaseName) {
+        String testName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
+        switch (testName) {
             case Utils.ASSIST_STRUCTURE:
                 setContentView(R.layout.test_app);
                 setTitle(R.string.testAppTitle);
                 return;
+            case Utils.TEXTVIEW:
+                setContentView(R.layout.text_view);
+                mTextView =  (TextView) findViewById(R.id.text_view);
+                mScrollView = (ScrollView) findViewById(R.id.scroll_view);
+                setTitle(R.string.textViewActivityTitle);
+                return;
+            case Utils.LARGE_VIEW_HIERARCHY:
+                setContentView(R.layout.multiple_text_views);
+                setTitle(R.string.testAppTitle);
+                return;
+            case Utils.WEBVIEW:
+                setContentView(R.layout.webview);
+                setTitle(R.string.webViewActivityTitle);
+                WebView webview = (WebView) findViewById(R.id.webview);
+                webview.setWebViewClient(new WebViewClient() {
+                    @Override
+                    public void onPageFinished(WebView view, String url) {
+                        sendBroadcast(new Intent(Utils.TEST_ACTIVITY_LOADED));
+                    }
+                });
+                webview.loadData(Utils.WEBVIEW_HTML, "text/html", "UTF-8");
+                //webview.loadUrl("https://android-developers.blogspot.com/2015/08/m-developer-preview-3-final-sdk.html");
+                return;
         }
     }
 
@@ -66,6 +96,7 @@
 
     public void start3pApp(String testCaseName) {
         Intent intent = new Intent();
+        intent.putExtra(Utils.TESTCASE_TYPE, testCaseName);
         intent.setAction("android.intent.action.TEST_APP_" + testCaseName);
         intent.setComponent(Utils.getTestAppComponent(testCaseName));
         startActivity(intent);
@@ -79,12 +110,14 @@
         startActivity(intent);
     }
 
-    @Override protected void onPause() {
+    @Override
+    protected void onPause() {
         Log.i(TAG, " in onPause");
         super.onPause();
     }
 
-    @Override protected void onStart() {
+    @Override
+    protected void onStart() {
         super.onStart();
         Log.i(TAG, " in onStart");
     }
@@ -94,7 +127,8 @@
         Log.i(TAG, " in onRestart");
     }
 
-    @Override protected void onStop() {
+    @Override
+    protected void onStop() {
         Log.i(TAG, " in onStop");
         super.onStop();
     }
@@ -104,4 +138,25 @@
         Log.i(TAG, " in onDestroy");
         super.onDestroy();
     }
+
+    public void scrollText(int scrollX, int scrollY, boolean scrollTextView,
+            boolean scrollScrollView) {
+        if (scrollTextView) {
+            if (scrollX < 0 || scrollY < 0) {
+                scrollX = mTextView.getWidth();
+                scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount()) - mTextView.getHeight();
+            }
+            Log.i(TAG, "Scrolling text view to " + scrollX + ", " + scrollY);
+            mTextView.scrollTo(scrollX, scrollY);
+        } else if (scrollScrollView) {
+            if (scrollX < 0 || scrollY < 0) {
+                Log.i(TAG, "Scrolling scroll view to bottom right");
+                mScrollView.fullScroll(View.FOCUS_DOWN);
+                mScrollView.fullScroll(View.FOCUS_RIGHT);
+            } else {
+                Log.i(TAG, "Scrolling scroll view to " + scrollX + ", " + scrollY);
+                mScrollView.scrollTo(scrollX, scrollY);
+            }
+        }
+    }
 }
diff --git a/tests/tests/assist/src/android/assist/cts/TextViewTest.java b/tests/tests/assist/src/android/assist/cts/TextViewTest.java
new file mode 100644
index 0000000..e4390bc
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/TextViewTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ *  Test that the AssistStructure returned is properly formatted.
+ */
+
+public class TextViewTest extends AssistTestBase {
+    private static final String TAG = "TextViewTest";
+    private static final String TEST_CASE_TYPE = Utils.TEXTVIEW;
+
+    private BroadcastReceiver mReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+    private CountDownLatch mReadyLatch = new CountDownLatch(1);
+
+    public TextViewTest() {
+        super();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+            mReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new TextViewTestBroadcastReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.APP_3P_HASRESUMED);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    public void testTextView() throws Exception {
+        mTestActivity.start3pApp(TEST_CASE_TYPE);
+        scrollTestApp(0, 0, true, false);
+
+        // Verify that the text view contains the right text
+        mTestActivity.startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady(mReadyLatch);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistDataNullness(false, false, false, false);
+
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
+                false /*FLAG_SECURE set*/);
+
+        // Verify that the scroll position of the text view is accurate after scrolling.
+        scrollTestApp(10, 50, true /* scrollTextView */, false /* scrollScrollView */);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
+
+        scrollTestApp(-1, -1, true, false);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
+
+        scrollTestApp(0, 0, true, true);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
+
+        scrollTestApp(10, 50, false, true);
+        waitForOnResume();
+        startSession();
+        waitForContext();
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE), false);
+    }
+
+    private class TextViewTestBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) &&  mReadyLatch != null) {
+                mReadyLatch.countDown();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/src/android/assist/cts/WebViewTest.java b/tests/tests/assist/src/android/assist/cts/WebViewTest.java
new file mode 100644
index 0000000..f15c7f5
--- /dev/null
+++ b/tests/tests/assist/src/android/assist/cts/WebViewTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.assist.cts;
+
+import android.assist.common.Utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ *  Test that the AssistStructure returned is properly formatted.
+ */
+
+public class WebViewTest extends AssistTestBase {
+    private static final String TAG = "WebViewTest";
+    private static final String TEST_CASE_TYPE = Utils.WEBVIEW;
+
+    private BroadcastReceiver mReceiver;
+    private CountDownLatch mHasResumedLatch = new CountDownLatch(1);
+    private CountDownLatch mTestWebViewLatch = new CountDownLatch(1);
+    private CountDownLatch mReadyLatch = new CountDownLatch(1);
+
+    public WebViewTest() {
+        super();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setUpAndRegisterReceiver();
+        startTestActivity(TEST_CASE_TYPE);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+            mReceiver = null;
+        }
+    }
+
+    private void setUpAndRegisterReceiver() {
+        if (mReceiver != null) {
+            mContext.unregisterReceiver(mReceiver);
+        }
+        mReceiver = new WebViewTestBroadcastReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.APP_3P_HASRESUMED);
+        filter.addAction(Utils.ASSIST_RECEIVER_REGISTERED);
+        filter.addAction(Utils.TEST_ACTIVITY_LOADED);
+        mContext.registerReceiver(mReceiver, filter);
+    }
+
+    private void waitForOnResume() throws Exception {
+        Log.i(TAG, "waiting for onResume() before continuing");
+        if (!mHasResumedLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            fail("Activity failed to resume in " + Utils.ACTIVITY_ONRESUME_TIMEOUT_MS + "msec");
+        }
+    }
+
+    private void waitForTestActivity() throws Exception {
+        Log.i(TAG, "waiting for webview in test activity to load");
+        if (!mTestWebViewLatch.await(Utils.ACTIVITY_ONRESUME_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            // wait for webView to load completely.
+        }
+    }
+
+    public void testWebView() throws Exception {
+        mTestActivity.start3pApp(TEST_CASE_TYPE);
+        mTestActivity.startTest(TEST_CASE_TYPE);
+        waitForAssistantToBeReady(mReadyLatch);
+        waitForOnResume();
+        waitForTestActivity();
+        startSession();
+        waitForContext();
+        verifyAssistDataNullness(false, false, false, false);
+        verifyAssistStructure(Utils.getTestAppComponent(TEST_CASE_TYPE),
+                false /*FLAG_SECURE set*/);
+    }
+
+    private class WebViewTestBroadcastReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(Utils.APP_3P_HASRESUMED) && mHasResumedLatch != null) {
+                mHasResumedLatch.countDown();
+            } else if (action.equals(Utils.ASSIST_RECEIVER_REGISTERED) && mReadyLatch != null) {
+                mReadyLatch.countDown();
+            } else if (action.equals(Utils.TEST_ACTIVITY_LOADED) && mTestWebViewLatch != null) {
+                mTestWebViewLatch.countDown();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/AndroidManifest.xml b/tests/tests/assist/testapp/AndroidManifest.xml
index ab7bb29..b14c067 100644
--- a/tests/tests/assist/testapp/AndroidManifest.xml
+++ b/tests/tests/assist/testapp/AndroidManifest.xml
@@ -18,6 +18,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.assist.testapp">
 
+    <uses-permission android:name="android.permission.INTERNET" />
+
     <application>
         <uses-library android:name="android.test.runner" />
 
@@ -26,6 +28,7 @@
                 android:theme="@android:style/Theme.Material.Light">
           <intent-filter>
               <action android:name="android.intent.action.TEST_APP_ASSIST_STRUCTURE" />
+              <action android:name="android.intent.action.TEST_APP_LARGE_VIEWHIERARCHY" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.VOICE" />
           </intent-filter>
@@ -72,6 +75,22 @@
                 <category android:name="android.intent.category.VOICE" />
             </intent-filter>
         </activity>
+        <activity android:name="TextViewActivity"
+            android:label="TextView Test Activity"
+            android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_APP_TEXTVIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity android:name="WebViewActivity"
+            android:label="WebView Test Activity"
+            android:theme="@android:style/Theme.Material.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.TEST_APP_WEBVIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
         <activity android:name="FocusChangeActivity"
             android:label="Focus Change Test Activity">
             <intent-filter>
diff --git a/tests/tests/assist/testapp/res/layout/multiple_text_views.xml b/tests/tests/assist/testapp/res/layout/multiple_text_views.xml
new file mode 100644
index 0000000..455d5e3
--- /dev/null
+++ b/tests/tests/assist/testapp/res/layout/multiple_text_views.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:orientation="vertical">
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <TextView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1"
+    android:scrollbars="vertical"
+    android:text="@string/text_too_large_to_fit" />
+
+  <ScrollView
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_weight="1">
+    <TextView
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:scrollbars="vertical"
+      android:text="@string/text_too_large_to_fit" />
+  </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/res/layout/text_view.xml b/tests/tests/assist/testapp/res/layout/text_view.xml
new file mode 100644
index 0000000..0f0f427
--- /dev/null
+++ b/tests/tests/assist/testapp/res/layout/text_view.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <TextView
+        android:id="@+id/text_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:focusable="false"
+        android:focusableInTouchMode="false"
+        android:scrollbars="vertical"
+        android:clickable="true"
+        android:text="@string/text_too_large_to_fit" />
+
+    <ScrollView
+        android:id="@+id/scroll_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_weight="1">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:scrollbars="vertical"
+            android:text="@string/text_too_large_to_fit" />
+    </ScrollView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/res/layout/webview.xml b/tests/tests/assist/testapp/res/layout/webview.xml
new file mode 100644
index 0000000..bdb8082
--- /dev/null
+++ b/tests/tests/assist/testapp/res/layout/webview.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <WebView
+        android:id="@+id/webview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </WebView>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/res/values/strings.xml b/tests/tests/assist/testapp/res/values/strings.xml
index ae4f16e..670024b 100644
--- a/tests/tests/assist/testapp/res/values/strings.xml
+++ b/tests/tests/assist/testapp/res/values/strings.xml
@@ -14,5 +14,271 @@
      limitations under the License.
 -->
 <resources>
+
+    <string name="app_name">Memegen</string>
+    <string name="hello_world">Hello world!</string>
+    <string name="action_settings">Settings</string>
     <string name="welcome">Hello there!</string>
+    <string name="text_too_large_to_fit">❤ ☀ ☆ ☂ ☻ ♞ ☯ ☭ ☢ € →Hello هتاف للترحيب שלום
+        përshëndetje Добры дзень 您好 হ্যালো здравей მიესალმები Χαίρετε હેલો नमस्ते Nnọọ こんにちは ಹಲೋ
+        Сәлеметсіз бе ជំរាបសួរ 안녕하세요 ສະບາຍດີ ഹലോ हॅलो Сайн байна уу नमस्ते سلامהעלא ہیلو
+        မင်္ဂလာပါ ਸਤ ਸ੍ਰੀ ਅਕਾਲ Здравствуйте здраво ආයුබෝවන් ஹலோ హలో สวัสดี Pẹlẹ o
+        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+        convallis nunc et vestibulum. Sed et consequat quam, blandit varius tortor. Curabitur
+        accumsan nulla lectus, placerat condimentum odio elementum vel. Nulla erat ex, accumsan ut
+        enim sagittis, scelerisque efficitur ante. Nullam quis orci nec magna maximus malesuada ac
+        id sem. Nam sagittis erat risus, a accumsan neque congue sit amet. Nullam risus velit,
+        faucibus eget scelerisque et, maximus eget arcu. Sed porta sed libero ac imperdiet.
+
+        Nulla sem lectus, ullamcorper id dui vel, rutrum interdum augue. Proin aliquam nisi vitae
+        hendrerit tempor. Mauris porttitor velit et egestas feugiat. Vivamus eu dapibus libero,
+        quis fringilla urna. Suspendisse non turpis dui. Vivamus facilisis diam vitae est auctor
+        luctus. Etiam quis lectus viverra, interdum turpis eu, aliquam sem. Nulla vulputate lacinia
+        nisi a dictum. Cras faucibus vitae tortor at ullamcorper. Quisque sit amet sapien maximus,
+        ornare nisi non, imperdiet magna. Vestibulum tempor metus ac mi ultrices dapibus.
+
+        Suspendisse potenti. Mauris pellentesque lacinia tristique. Pellentesque vel dui quis sem
+        lacinia imperdiet feugiat vitae sem. Proin a arcu magna. Sed quis augue eu mi accumsan
+        pellentesque pretium in leo. Duis euismod purus mauris, ac tempor erat auctor non. Quisque
+        bibendum est pulvinar ex dapibus, ac tincidunt nibh tempus. Mauris sodales sem id purus
+        commodo iaculis. Pellentesque a quam dapibus, vehicula lectus at, tincidunt arcu. In
+        placerat porttitor urna quis consequat. Nullam feugiat nisl sed urna hendrerit, sed
+        elementum massa iaculis. Fusce sit amet turpis hendrerit, varius lorem sed, luctus mi.
+        Phasellus sit amet ex orci. Duis scelerisque nisl quis efficitur maximus. Curabitur vitae
+        accumsan nunc, eget varius nisi.
+
+        Fusce efficitur malesuada luctus. Aliquam dapibus tortor sit amet purus semper, sit amet
+        pretium lorem feugiat. Maecenas gravida sed arcu et placerat. Nulla facilisi. Cras placerat
+        rutrum mi, in rutrum mauris maximus at. Mauris eu suscipit ante. Nullam pharetra egestas
+        diam a viverra. Donec sem turpis, tempor malesuada est vel, blandit accumsan magna. In
+        iaculis velit in efficitur hendrerit. Nulla facilisi. Curabitur eget ligula lorem. Sed sit
+        amet dolor ut ligula malesuada condimentum. Phasellus molestie augue eget libero commodo,
+        vel blandit ex blandit.
+
+        Morbi cursus tortor ante, et tempus nisi tempus et. Suspendisse quis gravida diam. Aliquam
+        efficitur dolor sit amet sollicitudin varius. Etiam libero purus, ornare nec nulla vel,
+        ullamcorper blandit nisl. Sed vel consequat diam, id placerat sem. Donec quis elementum
+        urna. In posuere bibendum nunc, in condimentum justo blandit ac. Quisque enim lorem,
+        gravida at purus at, sollicitudin imperdiet erat. Ut consectetur rutrum ante, et pretium
+        odio iaculis a. Nullam a nibh vulputate, volutpat lectus eu, pellentesque felis. Nam
+        vehicula suscipit diam nec convallis. Quisque congue maximus sem, sit amet hendrerit leo
+        tempor et.
+
+        Nam eu consequat dui. Sed semper dignissim mattis. Integer tortor eros, tempor in lectus a,
+        lobortis aliquam dolor. Phasellus at sagittis magna. Nulla eleifend orci ac urna auctor,
+        sit amet luctus urna vulputate. Nulla venenatis venenatis erat ac finibus. Etiam
+        ullamcorper elementum suscipit. Morbi nec velit non mauris porta finibus. Nullam in
+        sagittis odio. Praesent eget nisl ut mauris vestibulum feugiat. Sed vulputate at elit et
+        cursus. Praesent viverra erat blandit nunc egestas, vel feugiat ex condimentum. Class
+        aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+
+        Nulla fermentum mattis urna, non gravida eros vestibulum et. Fusce porttitor augue turpis,
+        sit amet aliquam augue sodales non. Nunc neque odio, sagittis sed gravida euismod, commodo
+        at libero. Donec porttitor pulvinar neque vitae lobortis. Aliquam accumsan velit nec sapien
+        placerat egestas. Aliquam at tincidunt massa, et dignissim justo. Donec sapien ante, rutrum
+        et tristique a, commodo a massa.
+
+        Nunc placerat lobortis magna, et molestie lacus semper porta. Lorem ipsum dolor sit amet,
+        consectetur adipiscing elit. Phasellus ac ligula dui. Duis ultrices viverra eros fermentum
+        finibus. Integer ultrices, felis in accumsan volutpat, mi ligula hendrerit nunc, nec
+        accumsan mauris tellus sit amet metus. Ut pharetra enim et sapien sollicitudin, nec
+        ultricies urna pharetra. Morbi non tortor nec dui feugiat rutrum. Aliquam malesuada sodales
+        risus, sed congue nunc accumsan vitae. Etiam nunc magna, tempus non suscipit eu, feugiat ut
+        nibh. Maecenas et libero ut nisl pellentesque tempor nec vel quam. Etiam sem ligula,
+        ullamcorper non dolor a, viverra placerat nulla. Nullam dictum commodo dui, sed ultrices
+        enim sagittis eget. Morbi non consectetur lectus. In gravida, augue vitae pulvinar
+        molestie, ligula orci vulputate ex, at bibendum urna felis nec nibh. Sed nisl nunc, iaculis
+        at augue venenatis, fringilla accumsan velit. Curabitur nec augue porttitor, rutrum nisi
+        vitae, elementum orci.
+
+        Vestibulum eu tortor iaculis, dignissim velit quis, rhoncus dolor. Donec et tincidunt
+        nulla. Duis faucibus auctor erat ac ultricies. In a fermentum mi. Fusce vitae mi id sem
+        interdum tincidunt. Nulla hendrerit orci turpis, in maximus elit mollis eget. Aliquam erat
+        volutpat. Phasellus mattis est nibh, ut scelerisque ligula egestas eu. Ut molestie orci a
+        malesuada tempor. Sed tempus arcu id orci gravida faucibus. Vivamus ac lacinia neque, at
+        vehicula magna.
+
+        Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+        Nullam aliquam, justo scelerisque egestas sodales, purus odio posuere arcu, ac ultrices
+        nunc felis non massa. Aliquam vulputate ipsum sed aliquet auctor. In pulvinar, eros sit
+        amet ultricies tristique, lacus ipsum scelerisque eros, nec vestibulum est lectus quis
+        lorem. Pellentesque ac augue ut eros mattis viverra vitae ut lacus. Phasellus imperdiet
+        efficitur elit eget tincidunt. Donec sodales metus at dolor pulvinar, at gravida nibh
+        facilisis. Sed nec tellus luctus, cursus lacus sed, euismod orci. Maecenas sit amet leo
+        orci. Nulla non leo non mi eleifend consequat sit amet vitae dui. Sed gravida gravida
+        justo, tincidunt ultrices justo semper vitae. Fusce at nisi nisl. Morbi molestie quis justo
+        a convallis. Curabitur massa lacus, feugiat quis mauris ac, malesuada viverra est.
+
+        Phasellus bibendum faucibus velit, ac scelerisque velit tincidunt eu. Curabitur quis
+        suscipit erat, ac feugiat odio. Nullam et sapien et nibh maximus posuere. Vivamus faucibus
+        justo eget dictum sollicitudin. Etiam at leo eget elit facilisis lobortis. Maecenas
+        bibendum tortor non erat pretium dignissim. Fusce id imperdiet augue. Suspendisse dignissim
+        magna vel odio viverra varius. Maecenas suscipit ante et lorem sodales vehicula. Quisque
+        vel magna id sem suscipit iaculis. Etiam in elementum risus.
+
+        Suspendisse odio nisi, pharetra et purus sit amet, placerat lobortis diam. Phasellus enim
+        nunc, posuere sed porta in, ornare eu ipsum. Phasellus imperdiet porta neque, vitae dapibus
+        tellus feugiat eget. Nulla sodales leo ac efficitur luctus. Vivamus eget ipsum quis ante
+        pulvinar blandit. Vestibulum a justo convallis justo elementum viverra ut sit amet nisl.
+        Suspendisse eget augue fermentum, sagittis risus a, rhoncus elit. Vestibulum in maximus
+        tortor, non vestibulum libero. Nunc accumsan neque a nisl dapibus, id laoreet neque congue.
+        Pellentesque sapien odio, fringilla non nulla nec, varius placerat diam. Aliquam
+        consectetur neque eu ipsum posuere, nec dignissim sem faucibus. Donec sit amet tempor
+        sapien. Nam at libero vel lorem dapibus ultrices a vel augue. Nunc facilisis justo ante,
+        mollis tristique velit aliquet quis. Mauris consectetur odio at urna bibendum aliquam.
+
+           Nullam lectus orci, hendrerit ut ultrices in, dapibus pellentesque nibh. Aliquam arcu
+        metus, lobortis vel dignissim id, tempus ut ante. Integer vitae ante augue. In hac habitasse
+        platea dictumst. Vestibulum in tellus ante. Cras nisi tellus, congue ac velit quis, rhoncus
+        ornare ligula. Sed facilisis gravida pellentesque. Praesent id ultrices orci, ac ultricies
+        arcu. Donec at ante quis augue faucibus congue. Donec mattis quam dui, ut vestibulum orci
+        tempor mattis. Phasellus in quam id tortor varius ullamcorper ac ac ante. Proin cursus
+        accumsan sem, vel finibus lectus eleifend ut. Donec efficitur feugiat diam id ultricies. In
+        quis euismod nisi. Vestibulum eget viverra sapien. Donec scelerisque nec elit vel viverra.
+
+           Sed mi urna, rutrum quis augue vel, aliquet placerat diam. Proin faucibus in odio et
+        consequat. Proin ut ex in mauris eleifend efficitur. Praesent ullamcorper sollicitudin urna,
+        sed mollis elit hendrerit non. Duis leo lorem, efficitur eu auctor sit amet, scelerisque
+        scelerisque magna. Mauris eget massa auctor, viverra arcu a, elementum nibh. Sed
+        pellentesque, nulla sed condimentum posuere, tortor metus congue sem, nec placerat neque
+        magna vitae purus.
+
+           Etiam at risus vitae sapien aliquam condimentum. Vestibulum id libero placerat purus
+        vehicula consectetur. Pellentesque sapien sapien, posuere at pulvinar at, ultrices sed est.
+        Maecenas nec condimentum ante. Aenean volutpat, ex condimentum hendrerit hendrerit, quam
+        nisl  pharetra nibh, vitae bibendum nisl odio vel lacus. Morbi mi tellus, bibendum id mauris
+        eu,  facilisis volutpat turpis. Maecenas rutrum convallis felis. Quisque eget feugiat felis.
+        Duis pellentesque iaculis massa ut facilisis. Donec nec commodo magna. Integer aliquet orci
+        a odio eleifend elementum. Quisque molestie, urna ut molestie eleifend, odio neque maximus
+        enim, eget viverra metus lectus eget quam. Fusce nec urna ac neque bibendum aliquam vel quis
+        dui. Fusce ac quam consequat, feugiat leo vitae, auctor felis.
+
+           Sed ac metus mauris. Sed sed velit ut tortor aliquam vestibulum at eu arcu. Etiam eu
+        posuere lacus. Maecenas id lacus quis sem mollis sodales. Quisque justo sapien, vulputate ac
+        mi ut, congue vestibulum orci. Donec euismod erat rutrum, laoreet urna sed, accumsan purus.
+        Donec eu quam a sapien condimentum accumsan. Sed at tellus lorem. Curabitur bibendum, arcu
+        sit amet finibus sodales, mi sem finibus sem, eget scelerisque tellus neque vel urna.
+        Suspendisse eu augue nec erat suscipit luctus sed non metus.
+
+           Suspendisse porttitor ex ipsum. Pellentesque tristique eros sed pharetra porttitor.
+        Quisque ut elit vehicula, aliquet est nec, faucibus tellus. Donec ex augue, congue eu
+        dignissim  maximus, vestibulum at purus. Nulla quam enim, laoreet sit amet molestie vel,
+        dapibus nec tortor. Sed interdum massa ac orci gravida, vel viverra lacus lacinia. Donec
+        nisl lacus, fermentum at faucibus ac, consequat ut nibh. Praesent laoreet est augue, vitae
+        maximus dui efficitur sit amet. Cras ipsum tellus, tincidunt at volutpat non, tincidunt ut
+        elit. Morbi commodo sagittis gravida. Pellentesque sed ante massa. Phasellus a turpis non
+        turpis cursus consequat sed nec tortor. Proin et augue elit.
+
+           Duis finibus sem commodo rutrum pulvinar. In sollicitudin ante magna, vel facilisis
+        tellus fringilla vel. Nam purus ex, tincidunt eget varius at, euismod nec elit. Curabitur
+        consequat nulla vel nisi iaculis, ut mattis odio congue. Nulla et mollis tortor, a maximus
+        justo. Donec semper eros sed nunc rhoncus condimentum. Donec nibh purus, interdum non lectus
+        id, porta convallis eros.
+
+           Sed hendrerit, dui non sagittis sollicitudin, enim ex imperdiet sapien, et maximus lorem
+        dolor a enim. Nulla risus nisl, vestibulum at ornare posuere, congue in felis. Duis sagittis
+        id diam a varius. Donec viverra eu orci sodales commodo. Cras metus tortor, sodales vitae
+        auctor non, scelerisque a ante. Quisque sodales nisi libero, ut lobortis enim suscipit ut.
+        Cras mi ipsum, maximus non bibendum sit amet, pharetra quis ipsum. Vestibulum venenatis, odi
+        at hendrerit pretium, tellus diam auctor justo, non posuere quam mauris id nisl. Nam dolor
+        nibh, molestie et lectus et, scelerisque porta elit. Vestibulum viverra condimentum auctor.
+        In eros tortor, convallis sed quam eu, ultrices malesuada purus. Integer lorem quam,
+        ultricies at est consectetur, sagittis porttitor eros. Proin non risus vitae lacus
+        consectetur malesuada non pulvinar justo. Aliquam mollis nisi nunc, sit amet vulputate metus
+        sollicitudin vel.
+
+           Quisque auctor varius fermentum. Praesent mollis justo sit amet est consectetur, in
+        volutpat tellus mollis. Aenean at bibendum eros, at finibus nibh. Phasellus nec mi sem.
+        Mauris pellentesque dui sit amet lobortis aliquam. Ut nec massa at urna aliquam gravida vel
+        in magna. Donec consectetur sapien magna, a auctor sapien placerat eu.
+
+           Pellentesque aliquet ante sed lacus gravida rutrum. Maecenas euismod varius felis, nec
+        tempus metus tempus et. Nam convallis augue a massa scelerisque, vel pharetra dolor
+        scelerisque. Fusce porttitor mi a magna rutrum condimentum. Aliquam fermentum at turpis at
+        auctor. Nulla ut suscipit dui. Donec rutrum viverra aliquam. Donec elementum nisl sapien, ac
+        blandit risus porta facilisis. Proin tellus dolor, ornare vel magna sit amet, maximus
+        volutpat felis. Aenean euismod aliquet purus, at finibus nunc elementum eu. Ut faucibus
+        ullamcorper consectetur. Aenean egestas arcu id mauris elementum, at sollicitudin est
+        congue. Sed a odio mattis, sollicitudin erat ut, tristique dolor. Aliquam luctus risus quis
+        tellus semper, a vestibulum nulla viverra.
+
+           Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
+        himenaeos. Vestibulum sit amet nisi felis. Praesent condimentum consequat lacus pulvinar
+        imperdiet. Praesent vel condimentum quam. Maecenas eu aliquet odio. Vestibulum sed nulla
+        mattis lacus porta bibendum a ac eros. Nunc porttitor sagittis laoreet. Duis porta eros at
+        congue tristique. Pellentesque quis fringilla neque, a hendrerit tellus. Pellentesque ac
+        nibh ac tellus pulvinar porttitor et in est. Integer blandit lorem libero, eu pulvinar
+        tellus posuere eget. Vivamus pretium nulla ligula, ut dapibus massa fringilla in.
+        Suspendisse consectetur sem non elit porta, id pellentesque erat dapibus. Quisque ex mi,
+        tempus et hendrerit nec, gravida quis odio. Ut at mi in leo scelerisque venenatis.
+
+           Ut sed tellus in risus tincidunt tempor ut at arcu. Maecenas ut convallis justo. In
+        rutrum urna eu massa rhoncus, eget condimentum augue vehicula. Nullam eget placerat erat.
+        Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
+        Aenean at volutpat orci, a lobortis dolor. Sed consequat facilisis interdum. Fusce libero
+        neque, fringilla in congue a, vehicula rutrum ipsum. Nam ornare placerat vestibulum. Proin
+        nec orci velit. Pellentesque scelerisque gravida diam, ut tristique libero tempus eu. Nam
+        semper lacus nec nulla volutpat imperdiet non eget tortor. Sed et pellentesque ligula.
+
+           Aenean a dolor dolor. Curabitur ut placerat lacus, sit amet aliquet orci. Aliquam erat
+        volutpat. Cras mollis sit amet lectus ornare pretium. Vestibulum fringilla orci vel est
+        iaculis, at mattis quam condimentum. Vivamus semper elit consectetur lectus gravida, in
+        sollicitudin mi fringilla. Donec eget lorem in orci blandit aliquam. Pellentesque libero
+        tellus, dignissim id augue et, vulputate viverra nisl. Cum sociis natoque penatibus et
+        magnis dis parturient montes, nascetur ridiculus mus. Donec ac vulputate metus, eu suscipit
+        sem. Donec placerat, nulla at sodales hendrerit, orci tortor vestibulum purus, non pharetra
+        nulla purus posuere arcu.
+
+           Quisque feugiat elit sem, ac interdum diam pharetra nec. Curabitur sem libero, vulputate
+        eu libero vitae, volutpat facilisis ligula. Aenean maximus erat laoreet, interdum ante in,
+        ultrices nisi. Nullam nec efficitur sapien. Integer feugiat et tortor ac bibendum. Donec a
+        scelerisque tortor. Cras quis viverra diam, vitae viverra ipsum. Aliquam ultrices neque sem,
+        congue sodales elit tempus sit amet. Pellentesque habitant morbi tristique senectus et netus
+        et malesuada fames ac turpis egestas. Sed dignissim ipsum eget diam rhoncus, ut finibus
+        nulla pretium. Morbi suscipit nibh vel nisl posuere molestie. Maecenas posuere turpis et
+        rutrum consectetur. Morbi venenatis arcu non gravida vulputate. Vivamus auctor tellus
+        ullamcorper ligula vestibulum cursus. Nunc gravida sit amet nisl quis facilisis.
+
+           Praesent ut justo vestibulum, accumsan mi et, feugiat purus. Nullam pulvinar iaculis
+        pharetra. Aliquam pulvinar risus sit amet elit suscipit tincidunt. In hac habitasse platea
+        dictumst. Etiam eget velit ac magna lacinia efficitur. Vestibulum ante ipsum primis in
+        faucibus orci luctus et ultrices posuere cubilia Curae; Cras volutpat tempus sollicitudin.
+        Ut et ante elit.
+
+           Sed ac tortor justo. Fusce sed metus libero. Duis sagittis tortor ac ante sollicitudin,
+        nec efficitur nibh euismod. Donec porttitor cursus quam, in aliquam lorem feugiat ut.
+        Aliquam tempor lacus eu feugiat feugiat. Nunc pulvinar, libero at auctor commodo, metus diam
+        commodo lorem, in feugiat elit ex non ligula. Quisque at vestibulum sapien, nec facilisis
+        neque. Aenean luctus, arcu ut rhoncus luctus, est massa rhoncus mauris, nec luctus urna sem
+        quis massa. Nam elit felis, congue et ligula eget, ultricies tincidunt erat. Vivamus
+        eleifend no dui ac dictum. In nulla justo, pulvinar ut tristique sed, congue et orci.
+
+           Quisque imperdiet mi lectus, ac scelerisque augue posuere ut. Duis non pulvinar ipsum,
+        finibus risus. Donec ullamcorper nisl at sodales lobortis. Mauris neque leo, vestibulum sit
+        amet placerat vel, aliquet vel sapien. Morbi massa tellus, scelerisque quis nisl in, feugiat
+        posuere augue. Aenean congue sem ut ipsum vulputate rhoncus vitae at eros. Maecenas in velit
+        orci pellentesque lobortis ac at felis. Vestibulum odio quam, lacinia dapibus ornare eu,
+        vulputate a eros. Curabitur eleifend ornare tellus, non sollicitudin justo viverra in. Sed
+        sodales neque et lacus semper, in pharetra est consequat. Nunc vehicula volutpat lectus, sit
+        amet scelerisque nisi. Aenean sollicitudin, sem at ultricies efficitur, eros metus
+        nisl, et fringilla felis lacus non orci. Praesent eros libero, finibus in purus id,
+        tempor ipsum. Donec suscipit libero velit. Aliquam quis diam pharetra, cursus ipsum in,
+        gravida metus. Maecenas ultrices ligula a ullamcorper scelerisque.
+
+           Donec tincidunt felis turpis, id venenatis neque convallis in. Proin euismod ligula nec
+        urna vulputate, sed elementum mauris ultrices. Ut efficitur sem vel mi vestibulum placerat.
+        Sed fermentum lacus nec metus dictum, a commodo quam fermentum. Sed vel vulputate magna.
+        Integer convallis nisi sit amet mi lobortis pellentesque. In egestas porttitor elit eu
+        scelerisque. Suspendisse eleifend vel enim quis tincidunt. Sed placerat risus et pretium
+        porttitor. Nam justo mi, cursus eu pellentesque vel, bibendum ut nisl. Nulla condimentum
+        lorem, non sagittis lorem volutpat vitae. Mauris nec libero lorem. Vestibulum lacus ex,
+        vulputate non massa vitae, pellentesque vestibulum dolor.
+
+           Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;
+        Suspendisse vitae erat nisl. Vestibulum elit ante, semper et semper sit amet, fringilla
+        sapien. Morbi ac nisi sit amet turpis tincidunt mattis ac eget nisl. Nunc a venenatis quam,
+        facilisis maximus odio. Aliquam erat volutpat. Maecenas leo enim, ornare a magna quis,
+        venenatis ornare nulla. Aliquam venenatis nibh et elit tincidunt, ut egestas lorem finibus.
+        Integer iaculis dolor sed enim blandit vestibulum. Nullam vel libero ultricies, sagittis
+        tortor non, molestie eros.</string>
 </resources>
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java
index 4e1dc80..af10f99 100644
--- a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/LifecycleActivity.java
@@ -39,22 +39,22 @@
 
     @Override
     protected void onPause() {
-        super.onPause();
         Log.i(TAG, "activity was paused");
         sendBroadcast(new Intent("android.intent.action.lifecycle_onpause"));
+        super.onPause();
     }
 
     @Override
     protected void onStop() {
-        super.onStop();
         Log.i(TAG, "activity was stopped");
         sendBroadcast(new Intent("android.intent.action.lifecycle_onstop"));
+        super.onStop();
     }
 
     @Override
     protected void onDestroy() {
-        super.onDestroy();
         Log.i(TAG, "activity was destroyed");
         sendBroadcast(new Intent("android.intent.action.lifecycle_ondestroy"));
+        super.onDestroy();
     }
 }
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java
index 79bd811c..e0f83cc 100644
--- a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TestApp.java
@@ -41,11 +41,20 @@
 public class TestApp extends Activity {
     static final String TAG = "TestApp";
 
+    private String mTestCaseName;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "TestApp created");
-        setContentView(R.layout.test_app);
+        mTestCaseName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
+        switch (mTestCaseName) {
+            case Utils.LARGE_VIEW_HIERARCHY:
+                setContentView(R.layout.multiple_text_views);
+                return;
+            default:
+                setContentView(R.layout.test_app);
+        }
     }
 
     @Override
@@ -58,7 +67,7 @@
             @Override
             public void onGlobalLayout() {
                 layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                sendBroadcast(new Intent(Utils.ASSIST_STRUCTURE_HASRESUMED));
+                sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
             }
         });
     }
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TextViewActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TextViewActivity.java
new file mode 100644
index 0000000..9e57e9b
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/TextViewActivity.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.assist.testapp;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import java.lang.Override;
+
+public class TextViewActivity extends Activity {
+    static final String TAG = "TextViewActivity";
+
+    private BroadcastReceiver mReceiver;
+    private TextView mTextView;
+    private ScrollView mScrollView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "TextViewActivity created");
+        setContentView(R.layout.text_view);
+        mScrollView = (ScrollView) findViewById(R.id.scroll_view);
+        mTextView = (TextView) findViewById(R.id.text_view);
+        mTextView.setMovementMethod(new ScrollingMovementMethod());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.i(TAG, "TextViewActivity has resumed");
+
+        mReceiver = new ScrollReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Utils.SCROLL_TEXTVIEW_ACTION);
+        filter.addAction(Utils.SCROLL_SCROLLVIEW_ACTION);
+        registerReceiver(mReceiver, filter);
+
+        final View layout = findViewById(android.R.id.content);
+        ViewTreeObserver vto = layout.getViewTreeObserver();
+        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
+            }
+        });
+    }
+
+    @Override
+    public void onPause() {
+        if (mReceiver != null) {
+            unregisterReceiver(mReceiver);
+        }
+        super.onPause();
+    }
+
+    class ScrollReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            int scrollX, scrollY;
+            scrollX = intent.getIntExtra(Utils.SCROLL_X_POSITION, 0);
+            scrollY = intent.getIntExtra(Utils.SCROLL_Y_POSITION, 0);
+            if (intent.getAction().equals(Utils.SCROLL_TEXTVIEW_ACTION)) {
+                Log.i(TAG, "Scrolling textview to (" + scrollX + "," + scrollY + ")");
+                if (scrollX < 0 || scrollY < 0) {
+                    // Scroll to bottom as negative positions are not possible.
+                    scrollX = mTextView.getWidth();
+                    scrollY = mTextView.getLayout().getLineTop(mTextView.getLineCount())
+                            - mTextView.getHeight();
+                }
+                TextViewActivity.this.mTextView.scrollTo(scrollX, scrollY);
+            } else if (intent.getAction().equals(Utils.SCROLL_SCROLLVIEW_ACTION)) {
+                Log.i(TAG, "Scrolling scrollview to (" + scrollX + "," + scrollY + ")");
+                if (scrollX < 0 || scrollY < 0) {
+                    // Scroll to bottom
+                    TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_DOWN);
+                    TextViewActivity.this.mScrollView.fullScroll(View.FOCUS_RIGHT);
+                } else {
+                    TextViewActivity.this.mScrollView.scrollTo(scrollX, scrollY);
+                }
+            }
+            Log.i(TAG, "the max height of this textview is: " + mTextView.getHeight());
+            Log.i(TAG, "the max line count of this text view is: " + mTextView.getMaxLines());
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/WebViewActivity.java b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/WebViewActivity.java
new file mode 100644
index 0000000..59f96cb
--- /dev/null
+++ b/tests/tests/assist/testapp/src/android/voiceinteraction/testapp/WebViewActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.assist.testapp;
+
+import android.assist.common.Utils;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import java.lang.Override;
+
+public class WebViewActivity extends Activity {
+    static final String TAG = "WebViewActivity";
+
+    private String mTestCaseName;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.i(TAG, "TestApp created");
+        mTestCaseName = getIntent().getStringExtra(Utils.TESTCASE_TYPE);
+        setContentView(R.layout.webview);
+        WebView webview = (WebView) findViewById(R.id.webview);
+        webview.setWebViewClient(new WebViewClient() {
+            @Override
+            public void onPageFinished(WebView view, String url){
+                sendBroadcast(new Intent(Utils.APP_3P_HASRESUMED));
+            }
+        });
+        webview.loadData(Utils.WEBVIEW_HTML, "text/html", "UTF-8");
+        //webview.loadUrl(
+        //        "https://android-developers.blogspot.com/2015/08/m-developer-preview-3-final-sdk.html");
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
index 55465ac..a69dc54 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
@@ -38,21 +38,27 @@
     private SensorCtsHelper() {}
 
     /**
-     * Get the value of the 95th percentile using nearest rank algorithm.
+     * Get percentiles using nearest rank algorithm.
      *
-     * @throws IllegalArgumentException if the collection is null or empty
+     * @throws IllegalArgumentException if the collection or percentiles is null or empty
      */
-    public static <TValue extends Comparable<? super TValue>> TValue get95PercentileValue(
-            Collection<TValue> collection) {
+    public static <TValue extends Comparable<? super TValue>> List<TValue> getPercentileValue(
+            Collection<TValue> collection, float[] percentiles) {
         validateCollection(collection);
+        if(percentiles == null || percentiles.length == 0) {
+            throw new IllegalStateException("percentiles cannot be null or empty");
+        }
 
         List<TValue> arrayCopy = new ArrayList<TValue>(collection);
         Collections.sort(arrayCopy);
 
-        // zero-based array index
-        int arrayIndex = (int) Math.round(arrayCopy.size() * 0.95 + .5) - 1;
-
-        return arrayCopy.get(arrayIndex);
+        List<TValue> percentileValues = new ArrayList<TValue>();
+        for (float p : percentiles) {
+            // zero-based array index
+            int arrayIndex = (int) Math.round(arrayCopy.size() * p + .5) - 1;
+            percentileValues.add(arrayCopy.get(arrayIndex));
+        }
+        return percentileValues;
     }
 
     /**
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
index d246ec5..d9ee5b8 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
@@ -43,15 +43,22 @@
 
     // sensorType: threshold (% of expected period)
     private static final SparseIntArray DEFAULTS = new SparseIntArray(12);
-    // Max allowed jitter (in percentage).
+    // Max allowed jitter in +/- sense (in percentage).
     private static final int GRACE_FACTOR = 2;
     private static final int THRESHOLD_PERCENT_FOR_HIFI_SENSORS = 1 * GRACE_FACTOR;
+
+    // Margin sample intervals that considered outliers, lower and higher margin is discarded
+    // before verification
+    private static final float OUTLIER_MARGIN = 0.025f; //2.5%
+
     static {
         // Use a method so that the @deprecation warning can be set for that method only
         setDefaults();
     }
 
-    private final int mThresholdAsPercentage;
+    private final float     mOutlierMargin;
+    private final long      mThresholdNs;
+    private final long      mExpectedPeriodNs; // for error message only
     private final List<Long> mTimestamps = new LinkedList<Long>();
 
     /**
@@ -59,8 +66,10 @@
      *
      * @param thresholdAsPercentage the acceptable margin of error as a percentage
      */
-    public JitterVerification(int thresholdAsPercentage) {
-        mThresholdAsPercentage = thresholdAsPercentage;
+    public JitterVerification(float outlierMargin, long thresholdNs, long expectedPeriodNs) {
+        mExpectedPeriodNs = expectedPeriodNs;
+        mOutlierMargin = outlierMargin;
+        mThresholdNs = thresholdNs;
     }
 
     /**
@@ -71,16 +80,20 @@
      */
     public static JitterVerification getDefault(TestSensorEnvironment environment) {
         int sensorType = environment.getSensor().getType();
-        int threshold = DEFAULTS.get(sensorType, -1);
-        if (threshold == -1) {
+
+        int thresholdPercent = DEFAULTS.get(sensorType, -1);
+        if (thresholdPercent == -1) {
             return null;
         }
         boolean hasHifiSensors = environment.getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_HIFI_SENSORS);
         if (hasHifiSensors) {
-           threshold = THRESHOLD_PERCENT_FOR_HIFI_SENSORS;
+           thresholdPercent = THRESHOLD_PERCENT_FOR_HIFI_SENSORS;
         }
-        return new JitterVerification(threshold);
+
+        long expectedPeriodNs = (long) environment.getExpectedSamplingPeriodUs() * 1000;
+        long jitterThresholdNs = expectedPeriodNs * thresholdPercent * 2 / 100; // *2 is for +/-
+        return new JitterVerification(OUTLIER_MARGIN, jitterThresholdNs, expectedPeriodNs);
     }
 
     /**
@@ -99,24 +112,33 @@
             return;
         }
 
-        List<Double> jitters = getJitterValues();
-        double jitter95PercentileNs = SensorCtsHelper.get95PercentileValue(jitters);
-        long firstTimestamp = mTimestamps.get(0);
-        long lastTimestamp = mTimestamps.get(timestampsCount - 1);
-        long measuredPeriodNs = (lastTimestamp - firstTimestamp) / (timestampsCount - 1);
-        double jitter95PercentilePercent = (jitter95PercentileNs * 100.0) / measuredPeriodNs;
-        stats.addValue(SensorStats.JITTER_95_PERCENTILE_PERCENT_KEY, jitter95PercentilePercent);
+        List<Long> deltas = getDeltaValues();
+        float percentiles[] = new float[2];
+        percentiles[0] = mOutlierMargin;
+        percentiles[1] = 1 - percentiles[0];
 
-        boolean success = (jitter95PercentilePercent < mThresholdAsPercentage);
+        List<Long> percentileValues = SensorCtsHelper.getPercentileValue(deltas, percentiles);
+        double normalizedRange =
+                (double)(percentileValues.get(1) - percentileValues.get(0)) / mThresholdNs;
+
+        double percentageJitter =
+                (double)(percentileValues.get(1) - percentileValues.get(0)) /
+                        mExpectedPeriodNs / 2 * 100; //one side variation comparing to sample time
+
+        stats.addValue(SensorStats.JITTER_95_PERCENTILE_PERCENT_KEY, percentageJitter);
+
+        boolean success = normalizedRange <= 1.0;
         stats.addValue(PASSED_KEY, success);
 
         if (!success) {
             String message = String.format(
-                    "Jitter out of range: measured period=%dns, jitter(95th percentile)=%.2f%%"
-                            + " (expected < %d%%)",
-                    measuredPeriodNs,
-                    jitter95PercentilePercent,
-                    mThresholdAsPercentage);
+                    "Jitter out of range: requested period = %dns, " +
+                    "jitter min, max, range (95th percentile) = (%dns, %dns, %dns), " +
+                    "jitter expected range <= %dns",
+                    mExpectedPeriodNs,
+                    percentileValues.get(0), percentileValues.get(1),
+                    percentileValues.get(1) - percentileValues.get(0),
+                    mThresholdNs);
             Assert.fail(message);
         }
     }
@@ -126,7 +148,7 @@
      */
     @Override
     public JitterVerification clone() {
-        return new JitterVerification(mThresholdAsPercentage);
+        return new JitterVerification(mOutlierMargin, mThresholdNs, mExpectedPeriodNs);
     }
 
     /**
@@ -138,19 +160,14 @@
     }
 
     /**
-     * Get the list of all jitter values. Exposed for unit testing.
+     * Get the list of delta values. Exposed for unit testing.
      */
-    List<Double> getJitterValues() {
+    List<Long> getDeltaValues() {
         List<Long> deltas = new ArrayList<Long>(mTimestamps.size() - 1);
         for (int i = 1; i < mTimestamps.size(); i++) {
             deltas.add(mTimestamps.get(i) - mTimestamps.get(i - 1));
         }
-        double deltaMean = StatisticsUtils.getMean(deltas);
-        List<Double> jitters = new ArrayList<Double>(deltas.size());
-        for (long delta : deltas) {
-            jitters.add(Math.abs(delta - deltaMean));
-        }
-        return jitters;
+        return deltas;
     }
 
     @SuppressWarnings("deprecation")
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
index 50e288c..79c3b65 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
@@ -27,11 +27,10 @@
 import java.util.List;
 
 /**
- * Tests for {@link EventOrderingVerification}.
+ * Tests for {@link JitterVerification}.
  */
 public class JitterVerificationTest extends TestCase {
 
-
     public void testVerify() {
         final int SAMPLE_SIZE = 100;
         // for unit testing the verification, only the parameter 'sensorMightHaveMoreListeners' is
@@ -67,37 +66,36 @@
         } catch (AssertionError e) {
             // Expected;
         }
-        verifyStats(stats, false, 47.34);
+        verifyStats(stats, false, 50); // 500 us range divide by 1ms requested sample time x 100%
     }
 
-    public void testCalculateJitter() {
+    public void testCalculateDelta() {
         long[] timestamps = new long[]{0, 1, 2, 3, 4};
         JitterVerification verification = getVerification(1, timestamps);
-        List<Double> jitterValues = verification.getJitterValues();
-        assertEquals(4, jitterValues.size());
-        assertEquals(0.0, jitterValues.get(0));
-        assertEquals(0.0, jitterValues.get(1));
-        assertEquals(0.0, jitterValues.get(2));
-        assertEquals(0.0, jitterValues.get(3));
+        List<Long> deltaValues = verification.getDeltaValues();
+        assertEquals(4, deltaValues.size());
+        assertEquals(1, deltaValues.get(0).doubleValue());
+        assertEquals(1, deltaValues.get(1).doubleValue());
+        assertEquals(1, deltaValues.get(2).doubleValue());
+        assertEquals(1, deltaValues.get(3).doubleValue());
 
         timestamps = new long[]{0, 0, 2, 4, 4};
         verification = getVerification(1, timestamps);
-        jitterValues = verification.getJitterValues();
-        assertEquals(4, jitterValues.size());
-        assertEquals(1.0, jitterValues.get(0));
-        assertEquals(1.0, jitterValues.get(1));
-        assertEquals(1.0, jitterValues.get(2));
-        assertEquals(1.0, jitterValues.get(3));
+        deltaValues = verification.getDeltaValues();
+        assertEquals(4, deltaValues.size());
+        assertEquals(0, deltaValues.get(0).doubleValue());
+        assertEquals(2, deltaValues.get(1).doubleValue());
+        assertEquals(2, deltaValues.get(2).doubleValue());
+        assertEquals(0, deltaValues.get(3).doubleValue());
 
         timestamps = new long[]{0, 1, 4, 9, 16};
         verification = getVerification(1, timestamps);
-        jitterValues = verification.getJitterValues();
-        assertEquals(4, jitterValues.size());
-        assertEquals(4, jitterValues.size());
-        assertEquals(3.0, jitterValues.get(0));
-        assertEquals(1.0, jitterValues.get(1));
-        assertEquals(1.0, jitterValues.get(2));
-        assertEquals(3.0, jitterValues.get(3));
+        deltaValues = verification.getDeltaValues();
+        assertEquals(4, deltaValues.size());
+        assertEquals(1, deltaValues.get(0).doubleValue());
+        assertEquals(3, deltaValues.get(1).doubleValue());
+        assertEquals(5, deltaValues.get(2).doubleValue());
+        assertEquals(7, deltaValues.get(3).doubleValue());
     }
 
     private static JitterVerification getVerification(int threshold, long ... timestamps) {
@@ -105,16 +103,20 @@
         for (long timestamp : timestamps) {
             events.add(new TestSensorEvent(null, timestamp, 0, null));
         }
-        JitterVerification verification = new JitterVerification(threshold);
+        long samplePeriodNs = 1000*1000; //1000Hz
+        long jitterThresholdNs = 20*1000; // 2%
+
+        JitterVerification verification =
+                new JitterVerification(threshold, jitterThresholdNs, samplePeriodNs);
         verification.addSensorEvents(events);
         return verification;
     }
 
-    private void verifyStats(SensorStats stats, boolean passed, double jitter95) {
+    private void verifyStats(SensorStats stats, boolean passed, double normalizedRange) {
         assertEquals(passed, stats.getValue(JitterVerification.PASSED_KEY));
         assertEquals(
-                jitter95,
+                normalizedRange,
                 (Double) stats.getValue(SensorStats.JITTER_95_PERCENTILE_PERCENT_KEY),
-                0.1);
+                0.01);
     }
 }
diff --git a/tests/tests/media/res/raw/on_input_buffer_filled_sigsegv.mp4 b/tests/tests/media/res/raw/on_input_buffer_filled_sigsegv.mp4
new file mode 100644
index 0000000..110c0d6
--- /dev/null
+++ b/tests/tests/media/res/raw/on_input_buffer_filled_sigsegv.mp4
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 03627df..75a5a13 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -97,6 +97,10 @@
         }
     }
 
+    public void testonInputBufferFilledSigsegv() throws Exception {
+        testIfMediaServerDied(R.raw.on_input_buffer_filled_sigsegv);
+    }
+
     public void testFlacHeapOverflow() throws Exception {
         testIfMediaServerDied(R.raw.heap_oob_flac);
     }
@@ -123,12 +127,17 @@
         AssetFileDescriptor afd = mResources.openRawResourceFd(res);
         mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
         afd.close();
-        mMediaPlayer.prepare();
-        mMediaPlayer.start();
-        if (!mOnCompletionCalled.waitForSignal(5000)) {
-            Log.w(LOG_TAG, "testIfMediaServerDied: Timed out waiting for Error/Completion");
+        try {
+            mMediaPlayer.prepare();
+            mMediaPlayer.start();
+            if (!mOnCompletionCalled.waitForSignal(5000)) {
+                Log.w(LOG_TAG, "testIfMediaServerDied: Timed out waiting for Error/Completion");
+            }
+        } catch (Exception e) {
+            Log.w(LOG_TAG, "playback failed", e);
+        } finally {
+            mMediaPlayer.release();
         }
-        mMediaPlayer.release();
     }
 
     // Bug 13652927
diff --git a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
index e3d2f09..fb1521d 100644
--- a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
@@ -174,6 +174,7 @@
         private boolean mSignaledDecoderEOS;
 
         protected boolean mCompleted;
+        protected boolean mEncoderIsActive;
         protected boolean mEncodeOutputFormatUpdated;
         protected final Object mCondition = new Object();
 
@@ -322,6 +323,10 @@
                         mCompleted = true;
                         mCondition.notifyAll(); // condition is always satisfied
                     }
+                } else {
+                    synchronized(mCondition) {
+                        mEncoderIsActive = true;
+                    }
                 }
             }
         }
@@ -395,6 +400,11 @@
                             break;
                         }
                         if (!haveBuffers()) {
+                            if (mEncoderIsActive) {
+                                mEncoderIsActive = false;
+                                Log.d(TAG, "No more input but still getting output from encoder.");
+                                continue;
+                            }
                             fail("timed out after " + mBuffersToRender.size()
                                     + " decoder output and " + mEncInputBuffers.size()
                                     + " encoder input buffers");
@@ -557,7 +567,6 @@
             implements SurfaceTexture.OnFrameAvailableListener {
         private static final String TAG = "SurfaceVideoProcessor";
         private boolean mFrameAvailable;
-        private boolean mEncoderIsActive;
         private boolean mGotDecoderEOS;
         private boolean mSignaledEncoderEOS;
 
diff --git a/tests/tests/security/jni/android_security_cts_AudioFlingerBinderTest.cpp b/tests/tests/security/jni/android_security_cts_AudioFlingerBinderTest.cpp
index f169d61..fb80d6b 100644
--- a/tests/tests/security/jni/android_security_cts_AudioFlingerBinderTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_AudioFlingerBinderTest.cpp
@@ -242,6 +242,53 @@
     return true;
 }
 
+jboolean android_security_cts_AudioFlinger_test_createEffect(JNIEnv* env __unused,
+                                                             jobject thiz __unused)
+{
+    sp<IAudioFlinger> af;
+    sp<MyDeathClient> dr;
+
+    if (!connectAudioFlinger(af, dr)) {
+        return false;
+    }
+
+    for (int j = 0; j < 10; ++j) {
+        Parcel data, reply;
+        data.writeInterfaceToken(af->getInterfaceDescriptor());
+        data.writeInt32((int32_t)j);
+        status_t status = af->asBinder(af)->transact(40, data, &reply); // 40 is CREATE_EFFECT
+        if (status != NO_ERROR) {
+            return false;
+        }
+
+        status = (status_t)reply.readInt32();
+        if (status == NO_ERROR) {
+            continue;
+        }
+
+        int id = reply.readInt32();
+        int enabled = reply.readInt32();
+        sp<IEffect> effect = interface_cast<IEffect>(reply.readStrongBinder());
+        effect_descriptor_t desc;
+        effect_descriptor_t descTarget;
+        memset(&desc, 0, sizeof(effect_descriptor_t));
+        memset(&descTarget, 0, sizeof(effect_descriptor_t));
+        reply.read(&desc, sizeof(effect_descriptor_t));
+        if (id != 0 || enabled != 0 || memcmp(&desc, &descTarget, sizeof(effect_descriptor_t))) {
+            return false;
+        }
+    }
+
+    sleep(1);
+
+    // Check that mediaserver did not crash
+    if (dr->afIsDead()) {
+        return false;
+    }
+
+    return true;
+}
+
 static JNINativeMethod gMethods[] = {
     {  "native_test_setMasterMute", "()Z",
             (void *) android_security_cts_AudioFlinger_test_setMasterMute },
@@ -251,6 +298,8 @@
             (void *) android_security_cts_AudioFlinger_test_listAudioPorts },
     {  "native_test_listAudioPatches", "()Z",
             (void *) android_security_cts_AudioFlinger_test_listAudioPatches },
+    {  "native_test_createEffect", "()Z",
+            (void *) android_security_cts_AudioFlinger_test_createEffect },
 };
 
 int register_android_security_cts_AudioFlingerBinderTest(JNIEnv* env)
diff --git a/tests/tests/security/jni/android_security_cts_AudioPolicyBinderTest.cpp b/tests/tests/security/jni/android_security_cts_AudioPolicyBinderTest.cpp
index 8f788d6..1e3fc86 100644
--- a/tests/tests/security/jni/android_security_cts_AudioPolicyBinderTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_AudioPolicyBinderTest.cpp
@@ -213,6 +213,38 @@
     return index;
 }
 
+jboolean android_security_cts_AudioPolicy_test_startAudioSource(JNIEnv* env __unused,
+                                                                jobject thiz __unused)
+{
+    sp<IAudioPolicyService> aps;
+
+    if (!init(aps, NULL, NULL)) {
+        return false;
+    }
+
+    // Keep synchronized with IAudioPolicyService.cpp!
+    enum {
+        START_AUDIO_SOURCE = 41,
+    };
+
+    for (int i = 0; i < 10; ++i) {
+        Parcel data, reply;
+        data.writeInterfaceToken(aps->getInterfaceDescriptor());
+        data.writeInt32(-i);
+        IInterface::asBinder(aps)->transact(START_AUDIO_SOURCE, data, &reply);
+        status_t err = (status_t)reply.readInt32();
+        if (err == NO_ERROR) {
+            continue;
+        }
+        audio_io_handle_t handle = (audio_io_handle_t)reply.readInt32();
+        if (handle != 0) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
 static JNINativeMethod gMethods[] = {
     {  "native_test_startOutput", "()Z",
             (void *) android_security_cts_AudioPolicy_test_startOutput },
@@ -224,6 +256,8 @@
                 (void *) android_security_cts_AudioPolicy_test_isStreamActiveRemotely },
     {  "native_test_getStreamVolumeLeak", "()I",
                 (void *) android_security_cts_AudioPolicy_test_getStreamVolumeLeak },
+    {  "native_test_startAudioSource", "()Z",
+                (void *) android_security_cts_AudioPolicy_test_startAudioSource },
 };
 
 int register_android_security_cts_AudioPolicyBinderTest(JNIEnv* env)
diff --git a/tests/tests/security/src/android/security/cts/AudioFlingerBinderTest.java b/tests/tests/security/src/android/security/cts/AudioFlingerBinderTest.java
index 37c472e..202bd65 100644
--- a/tests/tests/security/src/android/security/cts/AudioFlingerBinderTest.java
+++ b/tests/tests/security/src/android/security/cts/AudioFlingerBinderTest.java
@@ -56,8 +56,16 @@
         assertTrue(native_test_listAudioPatches());
     }
 
+    /**
+     * Checks that IAudioFlinger::createEffect() does not leak information on the server side.
+     */
+    public void test_createEffect() throws Exception {
+        assertTrue(native_test_createEffect());
+    }
+
     private static native boolean native_test_setMasterMute();
     private static native boolean native_test_setMasterVolume();
     private static native boolean native_test_listAudioPorts();
     private static native boolean native_test_listAudioPatches();
+    private static native boolean native_test_createEffect();
 }
diff --git a/tests/tests/security/src/android/security/cts/AudioPolicyBinderTest.java b/tests/tests/security/src/android/security/cts/AudioPolicyBinderTest.java
index f3bfa20..82346a1 100644
--- a/tests/tests/security/src/android/security/cts/AudioPolicyBinderTest.java
+++ b/tests/tests/security/src/android/security/cts/AudioPolicyBinderTest.java
@@ -65,9 +65,18 @@
         assertTrue(String.format("Leaked volume 0x%08X", volume), volume == 0);
     }
 
+    /**
+     * Checks that IAudioPolicyService::startAudioSource() cannot leak information from
+     * server side.
+     */
+    public void test_startAudioSource() throws Exception {
+        assertTrue(native_test_startAudioSource());
+    }
+
     private static native boolean native_test_startOutput();
     private static native boolean native_test_stopOutput();
     private static native boolean native_test_isStreamActive();
     private static native boolean native_test_isStreamActiveRemotely();
     private static native int native_test_getStreamVolumeLeak();
+    private static native boolean native_test_startAudioSource();
 }
diff --git a/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java b/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
index d188aab..19866de 100644
--- a/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
+++ b/tests/tests/security/src/android/security/cts/ClonedSecureRandomTest.java
@@ -26,7 +26,8 @@
 import android.security.cts.activity.ISecureRandomService;
 import android.security.cts.activity.SecureRandomService;
 import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
+
+import com.android.cts.util.TimeoutReq;
 
 import java.io.BufferedReader;
 import java.io.EOFException;
@@ -37,7 +38,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-@LargeTest
 public class ClonedSecureRandomTest extends AndroidTestCase {
     private static final int MAX_SHUTDOWN_TRIES = 50;
 
@@ -93,6 +93,7 @@
      * sees two newly started processes with the same PID and compares their
      * output.
      */
+    @TimeoutReq(minutes=15)
     public void testCheckForDuplicateOutput() throws Exception {
         assertEquals("Only supports up to " + MAX_PID + " because of memory requirements",
                 Integer.toString(MAX_PID), getFirstLineFromFile("/proc/sys/kernel/pid_max"));
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 5032911..2eb5145 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -471,10 +471,13 @@
           'android.alarmclock.cts.SnoozeAlarmTest#testAll',
       ],
       'android.assist' : [
-          'android.assist.cts.ExtraAssistDataTest',
           'android.assist.cts.AssistantContentViewTest',
-          'android.assist.cts.ScreenshotTest',
+          'android.assist.cts.ExtraAssistDataTest',
           'android.assist.cts.FocusChangeTest',
+          'android.assist.cts.LargeViewHierarchyTest',
+          'android.assist.cts.ScreenshotTest',
+          'android.assist.cts.TextViewTest',
+          'android.assist.cts.WebViewTest',
       ],
       'android.calllog' : [
           'android.calllog.cts.CallLogBackupTest#testSingleCallBackup',