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',