1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.accessibilityservice;
18 
19 import static org.hamcrest.Matchers.is;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertThat;
23 import static org.junit.Assert.assertTrue;
24 
25 import android.content.ComponentName;
26 import android.content.Context;
27 import android.content.pm.ActivityInfo;
28 import android.content.pm.PackageManager;
29 import android.view.accessibility.AccessibilityManager;
30 import android.view.accessibility.AccessibilityTestActivity;
31 
32 import androidx.test.filters.SmallTest;
33 import androidx.test.platform.app.InstrumentationRegistry;
34 import androidx.test.runner.AndroidJUnit4;
35 
36 import com.android.frameworks.coretests.R;
37 
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 
42 import java.util.List;
43 
44 /**
45  * AccessibilityShortcutInfo can only be created by system. Verify the instance creation and
46  * basic function here.
47  */
48 @SmallTest
49 @RunWith(AndroidJUnit4.class)
50 public class AccessibilityShortcutInfoTest {
51     private static final String SETTINGS_ACTIVITY_NAME =
52             "com.example.shortcut.target.SettingsActivity";
53 
54     private Context mTargetContext;
55     private PackageManager mPackageManager;
56     private ComponentName mComponentName;
57     private AccessibilityShortcutInfo mShortcutInfo;
58 
59     @Before
setUp()60     public void setUp() {
61         mTargetContext = InstrumentationRegistry.getInstrumentation()
62                 .getTargetContext();
63         mPackageManager = mTargetContext.getPackageManager();
64         mComponentName = new ComponentName(mTargetContext, AccessibilityTestActivity.class);
65         mShortcutInfo = getAccessibilityShortcutInfo(mComponentName);
66         assertNotNull("Can't find " + mComponentName, mShortcutInfo);
67     }
68 
69     @Test
testDescription()70     public void testDescription() {
71         final String description = mTargetContext.getResources()
72                 .getString(R.string.accessibility_shortcut_description);
73 
74         assertNotNull("Can't find description string", description);
75         assertThat("Description is not correct",
76                 mShortcutInfo.loadDescription(mPackageManager), is(description));
77     }
78 
79     @Test
testSummary()80     public void testSummary() {
81         final String summary = mTargetContext.getResources()
82                 .getString(R.string.accessibility_shortcut_summary);
83 
84         assertNotNull("Can't find summary string", summary);
85         assertThat("Summary is not correct",
86                 mShortcutInfo.loadSummary(mPackageManager), is(summary));
87     }
88 
89     @Test
testAnimatedImageRes()90     public void testAnimatedImageRes() {
91         assertThat("Animated image resource id is not correct",
92                 mShortcutInfo.getAnimatedImageRes(), is(R.drawable.bitmap_drawable));
93     }
94 
95     @Test
testLoadAnimatedImage()96     public void testLoadAnimatedImage() {
97         assertNotNull("Can't find animated image",
98                 mShortcutInfo.loadAnimatedImage(mTargetContext));
99     }
100 
101     @Test
testHtmlDescription()102     public void testHtmlDescription() {
103         final String htmlDescription = mTargetContext.getResources()
104                 .getString(R.string.accessibility_shortcut_html_description);
105 
106         assertNotNull("Can't find html description string", htmlDescription);
107         assertThat("Html description is not correct",
108                 mShortcutInfo.loadHtmlDescription(mPackageManager), is(htmlDescription));
109     }
110 
111     @Test
testSettingsActivity()112     public void testSettingsActivity() {
113         assertThat("Settings Activity is not correct",
114                 mShortcutInfo.getSettingsActivityName(), is(SETTINGS_ACTIVITY_NAME));
115     }
116 
117     @Test
testEquals()118     public void testEquals() {
119         assertTrue(mShortcutInfo.equals(mShortcutInfo));
120         assertFalse(mShortcutInfo.equals(null));
121         assertFalse(mShortcutInfo.equals(new Object()));
122 
123         final AccessibilityShortcutInfo sameCopy = getAccessibilityShortcutInfo(
124                 mComponentName);
125         assertTrue(mShortcutInfo != sameCopy);
126         assertTrue(mShortcutInfo.hashCode() == sameCopy.hashCode());
127         assertTrue(mShortcutInfo.getComponentName().equals(sameCopy.getComponentName()));
128         assertTrue(mShortcutInfo.equals(sameCopy));
129     }
130 
131     @Test
testToString()132     public void testToString() {
133         assertNotNull(mShortcutInfo.toString());
134     }
135 
getAccessibilityShortcutInfo(ComponentName componentName)136     private AccessibilityShortcutInfo getAccessibilityShortcutInfo(ComponentName componentName) {
137         final AccessibilityManager accessibilityManager = (AccessibilityManager) mTargetContext
138                 .getSystemService(Context.ACCESSIBILITY_SERVICE);
139         final List<AccessibilityShortcutInfo> infoList = accessibilityManager
140                 .getInstalledAccessibilityShortcutListAsUser(
141                         mTargetContext, mTargetContext.getUserId());
142         for (AccessibilityShortcutInfo info : infoList) {
143             final ActivityInfo activityInfo = info.getActivityInfo();
144             if (componentName.equals(activityInfo.getComponentName())) {
145                 return info;
146             }
147         }
148         return null;
149     }
150 }
151