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));
     }
 }