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     private static final String TILE_SERVICE_NAME =
54             "com.example.shortcut.target.TileService";
55 
56     private Context mTargetContext;
57     private PackageManager mPackageManager;
58     private ComponentName mComponentName;
59     private AccessibilityShortcutInfo mShortcutInfo;
60 
61     @Before
setUp()62     public void setUp() {
63         mTargetContext = InstrumentationRegistry.getInstrumentation()
64                 .getTargetContext();
65         mPackageManager = mTargetContext.getPackageManager();
66         mComponentName = new ComponentName(mTargetContext, AccessibilityTestActivity.class);
67         mShortcutInfo = getAccessibilityShortcutInfo(mComponentName);
68         assertNotNull("Can't find " + mComponentName, mShortcutInfo);
69     }
70 
71     @Test
testDescription()72     public void testDescription() {
73         final String description = mTargetContext.getResources()
74                 .getString(R.string.accessibility_shortcut_description);
75 
76         assertNotNull("Can't find description string", description);
77         assertThat("Description is not correct",
78                 mShortcutInfo.loadDescription(mPackageManager), is(description));
79     }
80 
81     @Test
testSummary()82     public void testSummary() {
83         final String summary = mTargetContext.getResources()
84                 .getString(R.string.accessibility_shortcut_summary);
85 
86         assertNotNull("Can't find summary string", summary);
87         assertThat("Summary is not correct",
88                 mShortcutInfo.loadSummary(mPackageManager), is(summary));
89     }
90 
91     @Test
testIntro()92     public void testIntro() {
93         final String intro = mTargetContext.getResources()
94                 .getString(R.string.accessibility_shortcut_intro);
95 
96         assertNotNull("Can't find intro string", intro);
97         assertThat("Intro is not correct",
98                 mShortcutInfo.loadIntro(mPackageManager), is(intro));
99     }
100 
101     @Test
testAnimatedImageRes()102     public void testAnimatedImageRes() {
103         assertThat("Animated image resource id is not correct",
104                 mShortcutInfo.getAnimatedImageRes(), is(R.drawable.bitmap_drawable));
105     }
106 
107     @Test
testLoadAnimatedImage()108     public void testLoadAnimatedImage() {
109         assertNotNull("Can't find animated image",
110                 mShortcutInfo.loadAnimatedImage(mTargetContext));
111     }
112 
113     @Test
testHtmlDescription()114     public void testHtmlDescription() {
115         final String htmlDescription = mTargetContext.getResources()
116                 .getString(R.string.accessibility_shortcut_html_description);
117 
118         assertNotNull("Can't find html description string", htmlDescription);
119         assertThat("Html description is not correct",
120                 mShortcutInfo.loadHtmlDescription(mPackageManager), is(htmlDescription));
121     }
122 
123     @Test
testSettingsActivity()124     public void testSettingsActivity() {
125         assertThat("Settings activity is not correct",
126                 mShortcutInfo.getSettingsActivityName(), is(SETTINGS_ACTIVITY_NAME));
127     }
128 
129     @Test
testTileService()130     public void testTileService() {
131         assertThat("Tile service is not correct",
132                 mShortcutInfo.getTileServiceName(), is(TILE_SERVICE_NAME));
133     }
134 
135 
136     @Test
testEquals()137     public void testEquals() {
138         assertTrue(mShortcutInfo.equals(mShortcutInfo));
139         assertFalse(mShortcutInfo.equals(null));
140         assertFalse(mShortcutInfo.equals(new Object()));
141 
142         final AccessibilityShortcutInfo sameCopy = getAccessibilityShortcutInfo(
143                 mComponentName);
144         assertTrue(mShortcutInfo != sameCopy);
145         assertTrue(mShortcutInfo.hashCode() == sameCopy.hashCode());
146         assertTrue(mShortcutInfo.getComponentName().equals(sameCopy.getComponentName()));
147         assertTrue(mShortcutInfo.equals(sameCopy));
148     }
149 
150     @Test
testToString()151     public void testToString() {
152         assertNotNull(mShortcutInfo.toString());
153     }
154 
getAccessibilityShortcutInfo(ComponentName componentName)155     private AccessibilityShortcutInfo getAccessibilityShortcutInfo(ComponentName componentName) {
156         final AccessibilityManager accessibilityManager = (AccessibilityManager) mTargetContext
157                 .getSystemService(Context.ACCESSIBILITY_SERVICE);
158         final List<AccessibilityShortcutInfo> infoList = accessibilityManager
159                 .getInstalledAccessibilityShortcutListAsUser(
160                         mTargetContext, mTargetContext.getUserId());
161         for (AccessibilityShortcutInfo info : infoList) {
162             final ActivityInfo activityInfo = info.getActivityInfo();
163             if (componentName.equals(activityInfo.getComponentName())) {
164                 return info;
165             }
166         }
167         return null;
168     }
169 }
170