AccessibilityManagerServiceTest.java revision 383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5
10b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov/* 20b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Copyright (C) 2010 The Android Open Source Project 30b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 40b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 50b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * you may not use this file except in compliance with the License. 60b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * You may obtain a copy of the License at 70b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 80b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 90b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * See the License for the specific language governing permissions and 140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * limitations under the License. 150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovpackage com.android.server; 180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.accessibilityservice.AccessibilityService; 200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.accessibilityservice.AccessibilityServiceInfo; 210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.content.ComponentName; 220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.content.Context; 230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.content.pm.ServiceInfo; 240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.os.IBinder; 250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.os.Message; 260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.os.ServiceManager; 270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.os.SystemClock; 280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.provider.Settings; 290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.AndroidTestCase; 300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.suitebuilder.annotation.LargeTest; 310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManager; 330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManagerClient; 340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov/** 360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * This test exercises the 370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * {@link com.android.server.AccessibilityManagerService} by mocking the 380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * {@link android.view.accessibility.AccessibilityManager} which talks to to the 390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * service. The service itself is interacting with the platform. Note: Testing 400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * the service in full isolation would require significant amount of work for 410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * mocking all system interactions. It would also require a lot of mocking code. 420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovpublic class AccessibilityManagerServiceTest extends AndroidTestCase { 440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Timeout required for pending Binder calls or event processing to 470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * complete. 480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static final long TIMEOUT_BINDER_CALL = 100; 500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 525637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * Timeout in which we are waiting for the system to start the mock 535637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * accessibility services. 545637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov */ 555637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov private static final long TIMEOUT_START_MOCK_ACCESSIBILITY_SERVICES = 300; 565637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 575637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov /** 580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Timeout used for testing that a service is notified only upon a 590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * notification timeout. 600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private static final long TIMEOUT_TEST_NOTIFICATION_TIMEOUT = 300; 620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * The interface used to talk to the tested service. 650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private IAccessibilityManager mManagerService; 670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @Override 690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void setContext(Context context) { 700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov super.setContext(context); 71383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov if (MyFirstMockAccessibilityService.sComponentName == null) { 72383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov MyFirstMockAccessibilityService.sComponentName = new ComponentName( 73383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov context.getPackageName(), MyFirstMockAccessibilityService.class.getName()) 74383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov .flattenToShortString(); 75383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov } 76383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov if (MySecondMockAccessibilityService.sComponentName == null) { 77383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov MySecondMockAccessibilityService.sComponentName = new ComponentName( 78383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov context.getPackageName(), MySecondMockAccessibilityService.class.getName()) 79383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov .flattenToShortString(); 800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Creates a new instance. 850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public AccessibilityManagerServiceTest() { 870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE); 880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService = IAccessibilityManager.Stub.asInterface(iBinder); 890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testAddClient_AccessibilityDisabledThenEnabled() throws Exception { 930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // make sure accessibility is disabled 940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, false); 950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create a client mock instance 970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MyMockAccessibilityManagerClient mockClient = new MyMockAccessibilityManagerClient(); 980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 1000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean enabledAccessibilityDisabled = mManagerService.addClient(mockClient); 1010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertFalse("The client must be disabled since accessibility is disabled.", 1040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov enabledAccessibilityDisabled); 1050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable accessibility 1070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 1080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 1100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean enabledAccessibilityEnabled = mManagerService.addClient(mockClient); 1110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertTrue("The client must be enabled since accessibility is enabled.", 1140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov enabledAccessibilityEnabled); 1150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 1180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testAddClient_AccessibilityEnabledThenDisabled() throws Exception { 1190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable accessibility before registering the client 1200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 1210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create a client mock instance 1230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MyMockAccessibilityManagerClient mockClient = new MyMockAccessibilityManagerClient(); 1240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 1260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean enabledAccessibilityEnabled = mManagerService.addClient(mockClient); 1270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertTrue("The client must be enabled since accessibility is enabled.", 1300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov enabledAccessibilityEnabled); 1310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // disable accessibility 1330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, false); 1340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // invoke the method under test 1360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean enabledAccessibilityDisabled = mManagerService.addClient(mockClient); 1370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertFalse("The client must be disabled since accessibility is disabled.", 1400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov enabledAccessibilityDisabled); 1410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 1440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testGetAccessibilityServicesList() throws Exception { 1450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean firstMockServiceInstalled = false; 1460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean secondMockServiceInstalled = false; 1470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov String packageName = getContext().getPackageName(); 1490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov String firstMockServiceClassName = MyFirstMockAccessibilityService.class.getName(); 1500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov String secondMockServiceClassName = MySecondMockAccessibilityService.class.getName(); 1510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // look for the two mock services 1530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov for (ServiceInfo serviceInfo : mManagerService.getAccessibilityServiceList()) { 1540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (packageName.equals(serviceInfo.packageName)) { 1550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (firstMockServiceClassName.equals(serviceInfo.name)) { 1560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstMockServiceInstalled = true; 1570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } else if (secondMockServiceClassName.equals(serviceInfo.name)) { 1580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondMockServiceInstalled = true; 1590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // check expected result 1640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertTrue("First mock service must be installed", firstMockServiceInstalled); 1650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertTrue("Second mock service must be installed", secondMockServiceInstalled); 1660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 1690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_OneService_MatchingPackageAndEventType() 1700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 1710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 1720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 1730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility service 1755637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, false); 1760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service 1780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService service = MyFirstMockAccessibilityService.sInstance; 1790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 1800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder call to #setService to complete 1820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 1830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 1850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 1860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 1870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations 1890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.expectEvent(sentEvent); 1900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.replay(); 1910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 1930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 1940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 1960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(service); 1970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 1980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 1990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 2000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_OneService_NotMatchingPackage() throws Exception { 2010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 2020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 2030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility service 2055637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, false); 2060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service 2080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService service = MyFirstMockAccessibilityService.sInstance; 2090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 2100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder call to #setService to complete 2120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 2130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 2150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 2160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 2170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setPackageName("no.service.registered.for.this.package"); 2180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations 2200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.replay(); 2210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 2230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 2240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 2260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(service); 2270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 2300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_OneService_NotMatchingEventType() throws Exception { 2310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 2320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 2330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility service 2355637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, false); 2360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service 2380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService service = MyFirstMockAccessibilityService.sInstance; 2390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 2400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder call to #setService to complete 2420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 2430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 2450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 2460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 2470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setEventType(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); 2480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations 2500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.replay(); 2510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 2530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 2540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 2560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(service); 2570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 2580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 2600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_OneService_NotifivationAfterTimeout() throws Exception { 2610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 2620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 2630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility service 2655637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, false); 2660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the mock service 2680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService service = MyFirstMockAccessibilityService.sInstance; 2690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo info = MockAccessibilityService.createDefaultInfo(); 2700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov info.notificationTimeout = TIMEOUT_TEST_NOTIFICATION_TIMEOUT; 2710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.setServiceInfo(info); 2720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder call to #setService to complete 2740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 2750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate the first event to be sent 2770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent firstEvent = AccessibilityEvent.obtain(); 2780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(firstEvent); 2790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate the second event to be sent 2810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent secondEvent = AccessibilityEvent.obtain(); 2820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(secondEvent); 2830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations 2850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.expectEvent(secondEvent); 2860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.replay(); 2870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the events 2890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(firstEvent); 2900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(secondEvent); 2910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for #sendAccessibilityEvent to reach the backing service 2930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 2940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 2950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov try { 2960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.verify(); 2970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fail("No events must be dispatched before the expiration of the notification timeout."); 2980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } catch (IllegalStateException ise) { 2990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /* expected */ 3000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 3010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the configured notification timeout to expire 3030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_TEST_NOTIFICATION_TIMEOUT); 3040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 3060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(service); 3070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 3080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 3100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_TwoServices_MatchingPackageAndEventType_DiffFeedback() 3110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 3120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 3130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 3140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility services 3165637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, true); 3170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the first mock service 3190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService firstService = MyFirstMockAccessibilityService.sInstance; 3200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo firstInfo = MockAccessibilityService.createDefaultInfo(); 3210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_AUDIBLE; 3220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.setServiceInfo(firstInfo); 3230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the second mock service 3250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService secondService = MySecondMockAccessibilityService.sInstance; 3260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo secondInfo = MockAccessibilityService.createDefaultInfo(); 3270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_HAPTIC; 3280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.setServiceInfo(secondInfo); 3290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder calls to #setService to complete 3310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 3320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 3340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 3350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 3360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the first mock service 3380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.expectEvent(sentEvent); 3390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.replay(); 3400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the second mock service 3420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.expectEvent(sentEvent); 3430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.replay(); 3440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 3460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 3470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 3490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(firstService); 3500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(secondService); 3510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 3520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 3540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_TwoServices_MatchingPackageAndEventType() 3550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 3560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 3570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 3580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility services 3605637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, true); 3610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the first mock service 3630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService firstService = MyFirstMockAccessibilityService.sInstance; 3640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 3650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the second mock service 3670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService secondService = MySecondMockAccessibilityService.sInstance; 3680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 3690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder calls to #setService to complete 3710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 3720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 3740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 3750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 3760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the first mock service 3780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.expectEvent(sentEvent); 3790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.replay(); 3800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the second mock service 3820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.replay(); 3830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 3850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 3860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 3880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(firstService); 3890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(secondService); 3900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 3910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 3930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_TwoServices_MatchingPackageAndEventType_OneDefault() 3940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 3950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 3960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 3970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 3980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility services 3995637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, true); 4000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the first mock service 4020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService firstService = MyFirstMockAccessibilityService.sInstance; 4030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo firstInfo = MyFirstMockAccessibilityService.createDefaultInfo(); 4040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstInfo.flags = AccessibilityServiceInfo.DEFAULT; 4050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.setServiceInfo(firstInfo); 4060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the second mock service 4080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService secondService = MySecondMockAccessibilityService.sInstance; 4090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.setServiceInfo(MySecondMockAccessibilityService.createDefaultInfo()); 4100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder calls to #setService to complete 4120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 4130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 4150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 4160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 4170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the first mock service 4190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.replay(); 4200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the second mock service 4220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.expectEvent(sentEvent); 4230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.replay(); 4240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 4260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 4270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 4290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(firstService); 4300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(secondService); 4310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 4320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 4340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testSendAccessibilityEvent_TwoServices_MatchingPackageAndEventType_TwoDefault() 4350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 4360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 4370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 4380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility services 4405637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, true); 4410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the first mock service 4430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService firstService = MyFirstMockAccessibilityService.sInstance; 4440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo firstInfo = MyFirstMockAccessibilityService.createDefaultInfo(); 4450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstInfo.flags = AccessibilityServiceInfo.DEFAULT; 4460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.setServiceInfo(firstInfo); 4470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the second mock service 4490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService secondService = MySecondMockAccessibilityService.sInstance; 4500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityServiceInfo secondInfo = MyFirstMockAccessibilityService.createDefaultInfo(); 4510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondInfo.flags = AccessibilityServiceInfo.DEFAULT; 4520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.setServiceInfo(firstInfo); 4530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder calls to #setService to complete 4550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 4560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // create and populate an event to be sent 4580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov AccessibilityEvent sentEvent = AccessibilityEvent.obtain(); 4590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov fullyPopulateDefaultAccessibilityEvent(sentEvent); 4600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the first mock service 4620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.expectEvent(sentEvent); 4630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.replay(); 4640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the second mock service 4660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.replay(); 4670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // send the event 4690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.sendAccessibilityEvent(sentEvent); 4700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 4720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(firstService); 4730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(secondService); 4740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 4750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov @LargeTest 4770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void testInterrupt() throws Exception { 4780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set the accessibility setting value 4790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov ensureAccessibilityEnabled(mContext, true); 4800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // enable the mock accessibility services 4825637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov ensureOnlyMockServicesEnabled(mContext, true, true); 4830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the first mock service 4850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService firstService = MyFirstMockAccessibilityService.sInstance; 4860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 4870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // configure the second mock service 4890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov MockAccessibilityService secondService = MySecondMockAccessibilityService.sInstance; 4900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.setServiceInfo(MockAccessibilityService.createDefaultInfo()); 4910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait for the binder calls to #setService to complete 4930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 4940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the first mock service 4960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.expectInterrupt(); 4970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov firstService.replay(); 4980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 4990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // set expectations for the second mock service 5000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.expectInterrupt(); 5010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov secondService.replay(); 5020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // call the method under test 5040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mManagerService.interrupt(); 5050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // verify if all expected methods have been called 5070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(firstService); 5080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov assertMockServiceVerifiedWithinTimeout(secondService); 5090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 5120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Fully populates the {@link AccessibilityEvent} to marshal. 5130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 5140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param sentEvent The event to populate. 5150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 5160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private void fullyPopulateDefaultAccessibilityEvent(AccessibilityEvent sentEvent) { 5170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setAddedCount(1); 5180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setBeforeText("BeforeText"); 5190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setChecked(true); 5200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setClassName("foo.bar.baz.Class"); 5210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setContentDescription("ContentDescription"); 5220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setCurrentItemIndex(1); 5230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setEnabled(true); 5240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setEventType(AccessibilityEvent.TYPE_VIEW_CLICKED); 5250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setEventTime(1000); 5260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setFromIndex(1); 5270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setFullScreen(true); 5280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setItemCount(1); 5290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setPackageName("foo.bar.baz"); 5300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setParcelableData(Message.obtain(null, 1, null)); 5310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setPassword(true); 5320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sentEvent.setRemovedCount(1); 5330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 5360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * This class is a mock {@link IAccessibilityManagerClient}. 5370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 5380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public class MyMockAccessibilityManagerClient extends IAccessibilityManagerClient.Stub { 5390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean mIsEnabled; 5400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public void setEnabled(boolean enabled) { 5420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov mIsEnabled = enabled; 5430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 5470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Ensures accessibility is in a given state by writing the state to the 5480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * settings and waiting until the accessibility manager service pick it up. 5490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 5500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param context A context handle to access the settings. 5510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param enabled The accessibility state to write to the settings. 5520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @throws Exception If any error occurs. 5530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 5540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private void ensureAccessibilityEnabled(Context context, boolean enabled) throws Exception { 5550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov boolean isEnabled = (Settings.Secure.getInt(context.getContentResolver(), 5560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1 ? true : false); 5570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (isEnabled == enabled) { 5590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return; 5600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, 5630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov enabled ? 1 : 0); 5640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // wait the accessibility manager service to pick the change up 5660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(TIMEOUT_BINDER_CALL); 5670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 5700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Ensures the only {@link MockAccessibilityService}s with given component 5710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * names are enabled by writing to the system settings and waiting until the 5725637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * accessibility manager service picks that up or the 5735637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * {@link #TIMEOUT_START_MOCK_ACCESSIBILITY_SERVICES} is exceeded. 5740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 5750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param context A context handle to access the settings. 5765637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * @param firstMockServiceEnabled If the first mock accessibility service is enabled. 5775637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * @param secondMockServiceEnabled If the second mock accessibility service is enabled. 5785637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * @throws IllegalStateException If some of the requested for enabling mock services 5795637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov * is not properly started. 5800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @throws Exception Exception If any error occurs. 5810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 5825637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov private void ensureOnlyMockServicesEnabled(Context context, boolean firstMockServiceEnabled, 5835637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov boolean secondMockServiceEnabled) throws Exception { 5840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov String enabledServices = Settings.Secure.getString(context.getContentResolver(), 5850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); 5860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov StringBuilder servicesToEnable = new StringBuilder(); 5885637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov if (firstMockServiceEnabled) { 5895637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov servicesToEnable.append(MyFirstMockAccessibilityService.sComponentName).append(":"); 5905637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov } 5915637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov if (secondMockServiceEnabled) { 5925637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov servicesToEnable.append(MySecondMockAccessibilityService.sComponentName).append(":"); 5930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov if (servicesToEnable.equals(enabledServices)) { 5960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return; 5970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 5980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 5990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Settings.Secure.putString(context.getContentResolver(), 6000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, servicesToEnable.toString()); 6010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6025637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov // we have enabled the services of interest and need to wait until they 6035637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov // are instantiated and started (if needed) and the system binds to them 6045637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov boolean firstMockServiceOK = false; 6055637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov boolean secondMockServiceOK = false; 6065637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov long start = SystemClock.uptimeMillis(); 6075637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov long pollingInterval = TIMEOUT_START_MOCK_ACCESSIBILITY_SERVICES / 6; 6085637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 6095637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov while (SystemClock.uptimeMillis() - start < TIMEOUT_START_MOCK_ACCESSIBILITY_SERVICES) { 6105637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov firstMockServiceOK = !firstMockServiceEnabled 6115637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov || (MyFirstMockAccessibilityService.sInstance != null 6125637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov && MyFirstMockAccessibilityService.sInstance.isSystemBoundAsClient()); 6135637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 6145637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov secondMockServiceOK = !secondMockServiceEnabled 6155637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov || (MySecondMockAccessibilityService.sInstance != null 6165637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov && MySecondMockAccessibilityService.sInstance.isSystemBoundAsClient()); 6175637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 6185637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov if (firstMockServiceOK && secondMockServiceOK) { 6195637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov return; 6205637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov } 6215637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 6225637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov Thread.sleep(pollingInterval); 6235637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov } 6245637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov 6255637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov StringBuilder message = new StringBuilder(); 6265637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov message.append("Mock accessibility services not started or system not bound as a client: "); 6275637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov if (!firstMockServiceOK) { 6285637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov message.append(MyFirstMockAccessibilityService.sComponentName); 6295637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov message.append(" "); 6305637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov } 6315637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov if (!secondMockServiceOK) { 6325637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov message.append(MySecondMockAccessibilityService.sComponentName); 6335637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov } 6345637745e59e1c0c22ec2e0adb1f48f8f4edcb7beSvetoslav Ganov throw new IllegalStateException(message.toString()); 6350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 6360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 6380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Asserts the the mock accessibility service has been successfully verified 6390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * (which is it has received the expected method calls with expected 6400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * arguments) within the {@link #TIMEOUT_BINDER_CALL}. The verified state is 6410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * checked by polling upon small intervals. 6420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * 6430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @param service The service to verify. 6440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * @throws Exception If the verification has failed with exception after the 6450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * {@link #TIMEOUT_BINDER_CALL}. 6460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 6470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov private void assertMockServiceVerifiedWithinTimeout(MockAccessibilityService service) 6480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throws Exception { 6490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Exception lastVerifyException = null; 6500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov long beginTime = SystemClock.uptimeMillis(); 6510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov long pollTmeout = TIMEOUT_BINDER_CALL / 5; 6520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // poll until the timeout has elapsed 6540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov while (SystemClock.uptimeMillis() - beginTime < TIMEOUT_BINDER_CALL) { 6550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // sleep first since immediate call will always fail 6560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov try { 6570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov Thread.sleep(pollTmeout); 6580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } catch (InterruptedException ie) { 6590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /* ignore */ 6600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 6610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // poll for verification and if this fails save the exception and 6620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // keep polling 6630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov try { 6640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.verify(); 6650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // reset so it does not accept more events 6660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.reset(); 6670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov return; 6680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } catch (Exception e) { 6690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov lastVerifyException = e; 6700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 6710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 6720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // reset, we have already failed 6740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov service.reset(); 6750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov // always not null 6770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov throw lastVerifyException; 6780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 6790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 6810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * This class is the first mock {@link AccessibilityService}. 6820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 6830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public static class MyFirstMockAccessibilityService extends MockAccessibilityService { 6840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 6860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * The service {@link ComponentName} flattened as a string. 6870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 688383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov static String sComponentName; 6890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 6910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Handle to the service instance. 6920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 6930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov static MyFirstMockAccessibilityService sInstance; 6940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 6950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 6960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Creates a new instance. 6970b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 6980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public MyFirstMockAccessibilityService() { 6990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sInstance = this; 7000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 7010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 7020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 7030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 7040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * This class is the first mock {@link AccessibilityService}. 7050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 7060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public static class MySecondMockAccessibilityService extends MockAccessibilityService { 7070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 7080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 7090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * The service {@link ComponentName} flattened as a string. 7100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 711383742c16d3dcbfcf748a89f0cb88ac8d2b31bb5Svetoslav Ganov static String sComponentName; 7120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 7130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 7140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Handle to the service instance. 7150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 7160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov static MySecondMockAccessibilityService sInstance; 7170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov 7180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov /** 7190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Creates a new instance. 7200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */ 7210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov public MySecondMockAccessibilityService() { 7220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov sInstance = this; 7230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 7240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov } 7250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov} 726