1b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds/*
2b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * Copyright (C) 2018 The Android Open Source Project
3b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds *
4b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
5b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * you may not use this file except in compliance with the License.
6b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * You may obtain a copy of the License at
7b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds *
8b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
9b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds *
10b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * Unless required by applicable law or agreed to in writing, software
11b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
12b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * See the License for the specific language governing permissions and
14b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds * limitations under the License.
15b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds */
16b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
17b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldspackage com.android.systemui.statusbar;
18b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
19b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static android.app.AppOpsManager.OP_CAMERA;
20b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static android.app.AppOpsManager.OP_RECORD_AUDIO;
21b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
22b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
23b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static junit.framework.Assert.assertEquals;
24b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static junit.framework.Assert.assertTrue;
25b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
26b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.any;
27b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.anyBoolean;
28b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.anyInt;
29b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.anyString;
30b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.eq;
31b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.mock;
32b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.times;
33b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.verify;
34b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport static org.mockito.Mockito.when;
35b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
36b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.app.Notification;
37b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.content.pm.ApplicationInfo;
38b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.content.pm.PackageInfo;
39b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.content.pm.PackageManager;
40b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.graphics.drawable.Drawable;
41b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.os.UserHandle;
42b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.service.notification.StatusBarNotification;
43b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.test.suitebuilder.annotation.SmallTest;
44b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.testing.AndroidTestingRunner;
45b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.testing.UiThreadTest;
46b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.util.ArraySet;
47b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.view.LayoutInflater;
48b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.view.View;
49b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.widget.ImageView;
50b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport android.widget.TextView;
51b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
52b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport com.android.systemui.R;
53b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport com.android.systemui.SysuiTestCase;
54b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
55b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport org.junit.Before;
56b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport org.junit.Test;
57b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport org.junit.runner.RunWith;
58b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
59b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldsimport java.util.concurrent.CountDownLatch;
60b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
61b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds@SmallTest
62b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds@RunWith(AndroidTestingRunner.class)
63b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds@UiThreadTest
64b586745d86a7335901646da128ef296e80ba0a22Julia Reynoldspublic class AppOpsInfoTest extends SysuiTestCase {
65b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private static final String TEST_PACKAGE_NAME = "test_package";
66b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private static final int TEST_UID = 1;
67b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
68b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private AppOpsInfo mAppOpsInfo;
69b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private final PackageManager mMockPackageManager = mock(PackageManager.class);
70b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private final NotificationGuts mGutsParent = mock(NotificationGuts.class);
71b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    private StatusBarNotification mSbn;
72b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
73b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Before
74b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void setUp() throws Exception {
75b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        // Inflate the layout
76b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
77b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo = (AppOpsInfo) layoutInflater.inflate(R.layout.app_ops_info, null);
78b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.setGutsParent(mGutsParent);
79b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
80b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        // PackageManager must return a packageInfo and applicationInfo.
81b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final PackageInfo packageInfo = new PackageInfo();
82b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        packageInfo.packageName = TEST_PACKAGE_NAME;
83b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        when(mMockPackageManager.getPackageInfo(eq(TEST_PACKAGE_NAME), anyInt()))
84b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                .thenReturn(packageInfo);
85b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final ApplicationInfo applicationInfo = new ApplicationInfo();
86b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        applicationInfo.uid = TEST_UID;  // non-zero
87b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
88b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                applicationInfo);
89b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
90b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0,
91b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                new Notification(), UserHandle.CURRENT, null, 0);
92b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
93b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
94b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
95b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testBindNotification_SetsTextApplicationName() {
96b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
97b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, new ArraySet<>());
98b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final TextView textView = mAppOpsInfo.findViewById(R.id.pkgname);
99b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertTrue(textView.getText().toString().contains("App Name"));
100b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
101b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
102b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
103b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testBindNotification_SetsPackageIcon() {
104b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final Drawable iconDrawable = mock(Drawable.class);
105b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        when(mMockPackageManager.getApplicationIcon(any(ApplicationInfo.class)))
106b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                .thenReturn(iconDrawable);
107b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, new ArraySet<>());
108b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final ImageView iconView = mAppOpsInfo.findViewById(R.id.pkgicon);
109b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals(iconDrawable, iconView.getDrawable());
110b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
111b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
112b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
113b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testBindNotification_SetsOnClickListenerForSettings() throws Exception {
114b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
115b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
116b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final CountDownLatch latch = new CountDownLatch(1);
117b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, (View v, String pkg, int uid,
118b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                ArraySet<Integer> ops) -> {
119b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(TEST_PACKAGE_NAME, pkg);
120b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(expectedOps, ops);
121b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(TEST_UID, uid);
122b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            latch.countDown();
123b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        }, mSbn, expectedOps);
124b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
125b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final View settingsButton = mAppOpsInfo.findViewById(R.id.settings);
126b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        settingsButton.performClick();
127b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        // Verify that listener was triggered.
128b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals(0, latch.getCount());
129b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
130b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
131b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
132b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testOk() {
133b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
134b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
135b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final CountDownLatch latch = new CountDownLatch(1);
136b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, (View v, String pkg, int uid,
137b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                ArraySet<Integer> ops) -> {
138b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(TEST_PACKAGE_NAME, pkg);
139b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(expectedOps, ops);
140b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            assertEquals(TEST_UID, uid);
141b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds            latch.countDown();
142b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        }, mSbn, expectedOps);
143b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
144b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        final View okButton = mAppOpsInfo.findViewById(R.id.ok);
145b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        okButton.performClick();
146b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals(1, latch.getCount());
147b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        verify(mGutsParent, times(1)).closeControls(anyInt(), anyInt(), anyBoolean(), anyBoolean());
148b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
149b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
150b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
151b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_camera() {
152b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
153b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
154b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
155b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
156b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is using the camera.", prompt.getText());
157b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
158b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
159b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
160b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_mic() {
161b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
162b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_RECORD_AUDIO);
163b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
164b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
165b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is using the microphone.", prompt.getText());
166b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
167b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
168b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
169b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_overlay() {
170b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
171b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_SYSTEM_ALERT_WINDOW);
172b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
173b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
174b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is displaying over other apps on your screen.", prompt.getText());
175b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
176b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
177b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
178b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_camera_mic() {
179b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
180b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
181b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_RECORD_AUDIO);
182b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
183b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
184b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is using the microphone and camera.", prompt.getText());
185b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
186b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
187b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
188b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_camera_mic_overlay() {
189b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
190b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
191b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_RECORD_AUDIO);
192b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_SYSTEM_ALERT_WINDOW);
193b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
194b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
195b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is displaying over other apps on your screen and using"
196b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                + " the microphone and camera.", prompt.getText());
197b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
198b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
199b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
200b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_camera_overlay() {
201b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
202b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_CAMERA);
203b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_SYSTEM_ALERT_WINDOW);
204b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
205b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
206b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is displaying over other apps on your screen and using"
207b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                + " the camera.", prompt.getText());
208b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
209b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds
210b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    @Test
211b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    public void testPrompt_mic_overlay() {
212b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        ArraySet<Integer> expectedOps = new ArraySet<>();
213b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_RECORD_AUDIO);
214b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        expectedOps.add(OP_SYSTEM_ALERT_WINDOW);
215b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        mAppOpsInfo.bindGuts(mMockPackageManager, null, mSbn, expectedOps);
216b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        TextView prompt = mAppOpsInfo.findViewById(R.id.prompt);
217b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds        assertEquals("This app is displaying over other apps on your screen and using"
218b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds                + " the microphone.", prompt.getText());
219b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds    }
220b586745d86a7335901646da128ef296e80ba0a22Julia Reynolds}
221