Merge "Add more CTS test cases for public APIs of allow rich content in Accessibility Settings." into rvc-dev
diff --git a/tests/accessibility/res/drawable/size_48x48.jpg b/tests/accessibility/res/drawable/jpg_48_48.jpg
similarity index 100%
rename from tests/accessibility/res/drawable/size_48x48.jpg
rename to tests/accessibility/res/drawable/jpg_48_48.jpg
Binary files differ
diff --git a/tests/accessibility/res/drawable/png_72_72.png b/tests/accessibility/res/drawable/png_72_72.png
new file mode 100644
index 0000000..941458d
--- /dev/null
+++ b/tests/accessibility/res/drawable/png_72_72.png
Binary files differ
diff --git a/tests/accessibility/res/drawable/vector_drawable_6kdp_6kdp.xml b/tests/accessibility/res/drawable/vector_drawable_6kdp_6kdp.xml
new file mode 100644
index 0000000..0d11dc0
--- /dev/null
+++ b/tests/accessibility/res/drawable/vector_drawable_6kdp_6kdp.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2019 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6000dp"
+ android:height="6000dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6,18c0,0.55 0.45,1 1,1h1v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L11,19h2v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L16,19h1c0.55,0 1,-0.45 1,-1L18,8L6,8v10zM3.5,8C2.67,8 2,8.67 2,9.5v7c0,0.83 0.67,1.5 1.5,1.5S5,17.33 5,16.5v-7C5,8.67 4.33,8 3.5,8zM20.5,8c-0.83,0 -1.5,0.67 -1.5,1.5v7c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-7c0,-0.83 -0.67,-1.5 -1.5,-1.5zM15.53,2.16l1.3,-1.3c0.2,-0.2 0.2,-0.51 0,-0.71 -0.2,-0.2 -0.51,-0.2 -0.71,0l-1.48,1.48C13.85,1.23 12.95,1 12,1c-0.96,0 -1.86,0.23 -2.66,0.63L7.85,0.15c-0.2,-0.2 -0.51,-0.2 -0.71,0 -0.2,0.2 -0.2,0.51 0,0.71l1.31,1.31C6.97,3.26 6,5.01 6,7h12c0,-1.99 -0.97,-3.75 -2.47,-4.84zM10,5L9,5L9,4h1v1zM15,5h-1L14,4h1v1z"/>
+</vector>
diff --git a/tests/accessibility/res/raw/test_file b/tests/accessibility/res/raw/test_file
new file mode 100644
index 0000000..acea7ed
--- /dev/null
+++ b/tests/accessibility/res/raw/test_file
@@ -0,0 +1,12 @@
+10101010110101010101101010101011010101010110101010101101010101011010101010110
+1010101011010101010110101010101101010101011010101011010101101101010101011011011010101101101
+1011010101010011010101010110101011011010101010110101011011010101010110110110101010101101
+10110101010101101010101011010101010110101010101101010101010101101010101011010101
+101101010101011010101010110101010101101010101011010101101011010101010110101010101101010101011010101
+101101010101101010101011010101101101010101011010101001010110101011011010101010110110101010101
+10110101010101101010101011010101010110101010101101010101010101101
+101101010101010110101010101101010110110101010101101010101011010101011101010101011010101101101010
+10110101010101011010101101101010101011010101101010101011010101101010101011010101
+101101010101011010101011010101010110101011011010101010110101010101101010101
+
+
diff --git a/tests/accessibility/res/values/strings.xml b/tests/accessibility/res/values/strings.xml
index de1539a..40c3359 100644
--- a/tests/accessibility/res/values/strings.xml
+++ b/tests/accessibility/res/values/strings.xml
@@ -32,8 +32,26 @@
<!-- Description of the speaking accessibility service -->
<string name="some_description">Some description</string>
+ <!-- Html description of the vibrating accessibility service -->
+ <string name="html_description_vibrating_accessibility_service"><![CDATA[
+ <A href=\"fake_link\">Test link</a> <IMG src = \"R.drawable.file_name\">
+ ]]></string>
+
<!-- Html description of the speaking accessibility service -->
- <string name="some_html_description">Some html description</string>
+ <string name="html_description_speaking_accessibility_service"><![CDATA[
+ <a href=\"fake_link\"> <img src=\"R.drawable.file_name\">
+ ]]></string>
+
+ <!-- Html description of the speaking and vibrating accessibility service -->
+ <string name="html_description_speaking_and_vibrating_accessibility_service"><![CDATA[
+ <a href=fake_link> <img src=R.drawable.file_name>
+ ]]></string>
+
+ <!-- Html description of the accessibility button service -->
+ <string name="html_description_accessibility_button_service"><![CDATA[
+ <img src=\"r.drawable.file_name\"> <img alt=\"foo\" src=\"R.drawable.file_name\">
+ <img src=\"file://path\"> <img src=\"http://path\">
+ ]]></string>
<!-- Summary of the speaking accessibility service -->
<string name="some_summary">Some summary</string>
diff --git a/tests/accessibility/res/xml/accessibility_button_service.xml b/tests/accessibility/res/xml/accessibility_button_service.xml
index d475266..e483fd4 100644
--- a/tests/accessibility/res/xml/accessibility_button_service.xml
+++ b/tests/accessibility/res/xml/accessibility_button_service.xml
@@ -18,4 +18,6 @@
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagRequestAccessibilityButton"
+ android:animatedImageDrawable="@raw/test_file"
+ android:htmlDescription="@string/html_description_accessibility_button_service"
android:notificationTimeout="0" />
\ No newline at end of file
diff --git a/tests/accessibility/res/xml/speaking_accessibilityservice.xml b/tests/accessibility/res/xml/speaking_accessibilityservice.xml
index ede686d..9128309 100644
--- a/tests/accessibility/res/xml/speaking_accessibilityservice.xml
+++ b/tests/accessibility/res/xml/speaking_accessibilityservice.xml
@@ -21,9 +21,9 @@
android:canRequestTouchExplorationMode="true"
android:canRequestFilterKeyEvents="true"
android:settingsActivity="foo.bar.Activity"
- android:animatedImageDrawable="@drawable/size_48x48"
+ android:animatedImageDrawable="@drawable/jpg_48_48"
android:description="@string/some_description"
- android:htmlDescription="@string/some_html_description"
+ android:htmlDescription="@string/html_description_speaking_accessibility_service"
android:summary="@string/some_summary"
android:nonInteractiveUiTimeout="1000"
android:interactiveUiTimeout="6000"/>
\ No newline at end of file
diff --git a/tests/accessibility/res/xml/speaking_and_vibrating_accessibilityservice.xml b/tests/accessibility/res/xml/speaking_and_vibrating_accessibilityservice.xml
index 3ac8661..09d36c6 100644
--- a/tests/accessibility/res/xml/speaking_and_vibrating_accessibilityservice.xml
+++ b/tests/accessibility/res/xml/speaking_and_vibrating_accessibilityservice.xml
@@ -22,7 +22,7 @@
android:canRequestFilterKeyEvents="true"
android:canRequestEnhancedWebAccessibility="true"
android:settingsActivity="foo.bar.Activity"
- android:animatedImageDrawable="@drawable/size_48x48"
+ android:animatedImageDrawable="@drawable/vector_drawable_6kdp_6kdp"
android:description="@string/some_description"
- android:htmlDescription="@string/some_html_description"
+ android:htmlDescription="@string/html_description_speaking_and_vibrating_accessibility_service"
android:summary="@string/some_summary" />
diff --git a/tests/accessibility/res/xml/vibrating_accessibilityservice.xml b/tests/accessibility/res/xml/vibrating_accessibilityservice.xml
index 93d9f0d..ddf4018 100644
--- a/tests/accessibility/res/xml/vibrating_accessibilityservice.xml
+++ b/tests/accessibility/res/xml/vibrating_accessibilityservice.xml
@@ -20,4 +20,6 @@
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:nonInteractiveUiTimeout="2000"
+ android:animatedImageDrawable="@drawable/png_72_72"
+ android:htmlDescription="@string/html_description_vibrating_accessibility_service"
android:interactiveUiTimeout="5000"/>
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
index d2f7c2d..8a75b54 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityServiceInfoTest.java
@@ -19,6 +19,7 @@
import static androidx.test.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
@@ -26,13 +27,16 @@
import android.accessibility.cts.common.AccessibilityDumpOnFailureRule;
import android.accessibility.cts.common.InstrumentedAccessibilityServiceTestRule;
import android.accessibilityservice.AccessibilityServiceInfo;
-import android.app.Service;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
+import org.junit.After;
+import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
@@ -49,22 +53,44 @@
*/
@RunWith(AndroidJUnit4.class)
public class AccessibilityServiceInfoTest {
+ private AccessibilityManager mAccessibilityManager;
+ private PackageManager mPackageManager;
+ private Context mContext;
- private InstrumentedAccessibilityServiceTestRule<SpeakingAccessibilityService>
+ private final InstrumentedAccessibilityServiceTestRule<SpeakingAccessibilityService>
mSpeakingAccessibilityServiceRule = new InstrumentedAccessibilityServiceTestRule<>(
- SpeakingAccessibilityService.class);
+ SpeakingAccessibilityService.class);
- private InstrumentedAccessibilityServiceTestRule<VibratingAccessibilityService>
+ private final InstrumentedAccessibilityServiceTestRule<VibratingAccessibilityService>
mVibratingAccessibilityServiceRule = new InstrumentedAccessibilityServiceTestRule<>(
- VibratingAccessibilityService.class);
+ VibratingAccessibilityService.class);
+
+ private final InstrumentedAccessibilityServiceTestRule<SpeakingAndVibratingAccessibilityService>
+ mSpeakingAndVibratingAccessibilityServiceRule =
+ new InstrumentedAccessibilityServiceTestRule<>(
+ SpeakingAndVibratingAccessibilityService.class, /* enableService= */ false);
+
+ private final InstrumentedAccessibilityServiceTestRule<AccessibilityButtonService>
+ mA11yButtonServiceRule = new InstrumentedAccessibilityServiceTestRule<>(
+ AccessibilityButtonService.class, /* enableService= */ false);
@Rule
public final RuleChain mRuleChain = RuleChain
.outerRule(mVibratingAccessibilityServiceRule)
.around(mSpeakingAccessibilityServiceRule)
+ .around(mSpeakingAndVibratingAccessibilityServiceRule)
+ .around(mA11yButtonServiceRule)
// Inner rule capture failure and dump data before finishing a11y service
.around(new AccessibilityDumpOnFailureRule());
+ @Before
+ public void setUp() throws Exception {
+ mContext = getInstrumentation().getContext();
+ mAccessibilityManager = getInstrumentation().getContext().getSystemService(
+ AccessibilityManager.class);
+ mPackageManager = getInstrumentation().getContext().getPackageManager();
+ }
+
/**
* Tests whether a service can that requested it can retrieve
* window content.
@@ -73,13 +99,12 @@
@SuppressWarnings("deprecation")
@Test
public void testAccessibilityServiceInfoForEnabledService() {
- AccessibilityManager accessibilityManager = (AccessibilityManager)
- getInstrumentation().getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);
- List<AccessibilityServiceInfo> enabledServices =
- accessibilityManager.getEnabledAccessibilityServiceList(
- AccessibilityServiceInfo.FEEDBACK_SPOKEN);
- assertSame("There should be one speaking service.", 1, enabledServices.size());
- AccessibilityServiceInfo speakingService = enabledServices.get(0);
+ final List<AccessibilityServiceInfo> enabledServices =
+ mAccessibilityManager.getEnabledAccessibilityServiceList(
+ AccessibilityServiceInfo.FEEDBACK_SPOKEN);
+ assertSame(/* message= */ "There should be one speaking service.",
+ /* expected= */ 1, enabledServices.size());
+ final AccessibilityServiceInfo speakingService = enabledServices.get(0);
assertSame(AccessibilityEvent.TYPES_ALL_MASK, speakingService.eventTypes);
assertSame(AccessibilityServiceInfo.FEEDBACK_SPOKEN, speakingService.feedbackType);
assertEquals(AccessibilityServiceInfo.DEFAULT
@@ -89,8 +114,8 @@
| AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS
| AccessibilityServiceInfo.FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK,
speakingService.flags);
- assertSame(0l, speakingService.notificationTimeout);
- assertEquals("Some description", speakingService.getDescription());
+ assertSame(/* expected= */ 0l, speakingService.notificationTimeout);
+ assertEquals(/* expected= */ "Some description", speakingService.getDescription());
assertNull(speakingService.packageNames /*all packages*/);
assertNotNull(speakingService.getId());
assertSame(speakingService.getCapabilities(),
@@ -98,15 +123,86 @@
| AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
| AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT);
assertEquals("foo.bar.Activity", speakingService.getSettingsActivityName());
- assertNotNull(speakingService.loadAnimatedImage(getInstrumentation().getContext()));
- assertEquals("Some description", speakingService.loadDescription(
- getInstrumentation().getContext().getPackageManager()));
- assertEquals("Some html description", speakingService.loadHtmlDescription(
- getInstrumentation().getContext().getPackageManager()));
- assertEquals("Some summary", speakingService.loadSummary(
- getInstrumentation().getContext().getPackageManager()));
+ assertNotNull(speakingService.loadAnimatedImage(mContext));
+ assertEquals(/* expected= */ "Some description",
+ speakingService.loadDescription(mPackageManager));
+ assertEquals(/* expected= */
+ "<invalidtag href=\"fake_link\"> <img src=\"R.drawable.file_name\">",
+ speakingService.loadHtmlDescription(mPackageManager));
+ assertEquals(/* expected= */ "Some summary",
+ speakingService.loadSummary(mPackageManager));
assertNotNull(speakingService.getResolveInfo());
- assertEquals(6000, speakingService.getInteractiveUiTimeoutMillis());
- assertEquals(1000, speakingService.getNonInteractiveUiTimeoutMillis());
+ assertEquals(/* expected= */ 6000,
+ speakingService.getInteractiveUiTimeoutMillis());
+ assertEquals(/* expected= */ 1000,
+ speakingService.getNonInteractiveUiTimeoutMillis());
+ }
+
+ /**
+ * Tests the html description of accessibility services whether to meet the custom
+ * specification.
+ */
+ @Test
+ public void testAccessibilityServicesHtmlDescription() {
+ mSpeakingAndVibratingAccessibilityServiceRule.enableService();
+ mA11yButtonServiceRule.enableService();
+ final List<AccessibilityServiceInfo> enabledServices =
+ mAccessibilityManager.getEnabledAccessibilityServiceList(
+ AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
+ final AccessibilityServiceInfo vibratingService =
+ mVibratingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo speakingService =
+ mSpeakingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo speakingAndVibratingService =
+ mSpeakingAndVibratingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo a11yService =
+ mA11yButtonServiceRule.getService().getServiceInfo();
+
+ assertSame(/* message= */ "There should be four services.", /* expected= */ 4,
+ enabledServices.size());
+ assertEquals(/* expected= */
+ "<invalidtag href=\"fake_link\">Test link</invalidtag> "
+ + "<IMG src = \"R.drawable.file_name\">",
+ vibratingService.loadHtmlDescription(mPackageManager));
+ assertEquals(/* expected= */
+ "<invalidtag href=\"fake_link\"> <img src=\"R.drawable.file_name\">",
+ speakingService.loadHtmlDescription(mPackageManager));
+ assertEquals(/* expected= */
+ "<invalidtag href=fake_link> <invalidtag src=R.drawable.file_name>",
+ speakingAndVibratingService.loadHtmlDescription(mPackageManager));
+ assertEquals(/* expected= */
+ "<invalidtag src=\"r.drawable.file_name\"> "
+ + "<invalidtag alt=\"foo\" src=\"R.drawable.file_name\"> "
+ + "<invalidtag src=\"file://path\"> "
+ + "<invalidtag src=\"http://path\">",
+ a11yService.loadHtmlDescription(mPackageManager));
+ }
+
+ /**
+ * Tests the animated image resource of accessibility services whether to meet the custom
+ * specification.
+ */
+ @Test
+ public void testAccessibilityServicesAnimatedImageResource() {
+ mSpeakingAndVibratingAccessibilityServiceRule.enableService();
+ mA11yButtonServiceRule.enableService();
+ final List<AccessibilityServiceInfo> enabledServices =
+ mAccessibilityManager.getEnabledAccessibilityServiceList(
+ AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
+ final AccessibilityServiceInfo vibratingService =
+ mVibratingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo speakingService =
+ mSpeakingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo speakingAndVibratingService =
+ mSpeakingAndVibratingAccessibilityServiceRule.getService().getServiceInfo();
+ final AccessibilityServiceInfo a11yService =
+ mA11yButtonServiceRule.getService().getServiceInfo();
+
+ assertSame(/* message= */ "There should be four services.", /* expected= */ 4,
+ enabledServices.size());
+ assertNotNull(vibratingService.loadAnimatedImage(mContext));
+ assertNotNull(speakingService.loadAnimatedImage(mContext));
+ assertNull(speakingAndVibratingService.loadAnimatedImage(mContext));
+ assertNull(a11yService.loadAnimatedImage(mContext));
}
}