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