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 static org.easymock.EasyMock.createStrictMock;
200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.expect;
210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.replay;
220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.reportMatcher;
230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.reset;
240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport static org.easymock.EasyMock.verify;
250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport org.easymock.IArgumentMatcher;
270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
28cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.accessibilityservice.AccessibilityServiceInfo;
2958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganovimport android.os.UserHandle;
300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.AndroidTestCase;
310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.suitebuilder.annotation.LargeTest;
320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.test.suitebuilder.annotation.MediumTest;
330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.AccessibilityManager;
350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManager;
360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport android.view.accessibility.IAccessibilityManagerClient;
370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport java.util.ArrayList;
390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovimport java.util.List;
400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov/**
420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov * Tests for the AccessibilityManager which mocking the backing service.
430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov */
440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganovpublic class AccessibilityManagerTest extends AndroidTestCase {
450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * Timeout required for pending Binder calls or event processing to
480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * complete.
490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public static final long TIMEOUT_BINDER_CALL = 50;
510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * The reusable mock {@link IAccessibilityManager}.
540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    private final IAccessibilityManager mMockServiceInterface =
560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        createStrictMock(IAccessibilityManager.class);
570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @Override
590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void setUp() throws Exception {
600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        reset(mMockServiceInterface);
610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @MediumTest
640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void testGetAccessibilityServiceList() throws Exception {
650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // create a list of installed accessibility services the mock service returns
66cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        List<AccessibilityServiceInfo> expectedServices = new ArrayList<AccessibilityServiceInfo>();
67cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
68cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        accessibilityServiceInfo.packageNames = new String[] { "foo.bar" };
69cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        expectedServices.add(accessibilityServiceInfo);
700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // configure the mock service behavior
720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        IAccessibilityManager mockServiceInterface = mMockServiceInterface;
7358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
7458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(
7500aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov                AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
7658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.getInstalledAccessibilityServiceList(UserHandle.USER_OWNER))
7758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                .andReturn(expectedServices);
780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        replay(mockServiceInterface);
790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test
8158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
8258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER);
83cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        List<AccessibilityServiceInfo> receivedServices =
84cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            manager.getInstalledAccessibilityServiceList();
850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // check expected result (list equals() compares it contents as well)
870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        assertEquals("All expected services must be returned", receivedServices, expectedServices);
880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // verify the mock service was properly called
900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        verify(mockServiceInterface);
910b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
920b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @MediumTest
940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void testInterrupt() throws Exception {
950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // configure the mock service behavior
960b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        IAccessibilityManager mockServiceInterface = mMockServiceInterface;
9758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
9858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(
9958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                        AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
10058d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        mockServiceInterface.interrupt(UserHandle.USER_OWNER);
1010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        replay(mockServiceInterface);
1020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test
10458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
10558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER);
1060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        manager.interrupt();
1070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // verify the mock service was properly called
1090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        verify(mockServiceInterface);
1100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
1110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @LargeTest
1130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void testIsEnabled() throws Exception {
1140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // configure the mock service behavior
1150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        IAccessibilityManager mockServiceInterface = mMockServiceInterface;
11658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
11758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(
11858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                        AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
1190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        replay(mockServiceInterface);
1200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test
12258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
12358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER);
1240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        boolean isEnabledServiceEnabled = manager.isEnabled();
1250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // check expected result
1270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        assertTrue("Must be enabled since the mock service is enabled", isEnabledServiceEnabled);
1280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // disable accessibility
13000aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov        manager.getClient().setState(0);
1310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // wait for the asynchronous IBinder call to complete
1330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        Thread.sleep(TIMEOUT_BINDER_CALL);
1340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test
1360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        boolean isEnabledServcieDisabled = manager.isEnabled();
1370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // check expected result
1390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        assertFalse("Must be disabled since the mock service is disabled",
1400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov                isEnabledServcieDisabled);
1410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // verify the mock service was properly called
1430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        verify(mockServiceInterface);
1440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
1450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @MediumTest
1470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void testSendAccessibilityEvent_AccessibilityEnabled() throws Exception {
1480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // create an event to be dispatched
1490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        AccessibilityEvent sentEvent = AccessibilityEvent.obtain();
1500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // configure the mock service behavior
1520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        IAccessibilityManager mockServiceInterface = mMockServiceInterface;
15358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
15458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(
15558d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                        AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED);
15658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent),
15758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(true);
15858d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.sendAccessibilityEvent(eqAccessibilityEvent(sentEvent),
15958d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(false);
1600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        replay(mockServiceInterface);
1610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test (manager and service in different processes)
16358d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
16458d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER);
1650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        manager.sendAccessibilityEvent(sentEvent);
1660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // check expected result
1680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        AccessibilityEvent nextEventDifferentProcesses = AccessibilityEvent.obtain();
1690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        assertSame("The manager and the service are in different processes, so the event must be " +
1700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov                "recycled", sentEvent, nextEventDifferentProcesses);
1710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test (manager and service in the same process)
1730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        manager.sendAccessibilityEvent(sentEvent);
1740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1750b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // check expected result
1760b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        AccessibilityEvent nextEventSameProcess = AccessibilityEvent.obtain();
1770b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        assertNotSame("The manager and the service are in the same process, so the event must not" +
1780b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov                "be recycled", sentEvent, nextEventSameProcess);
1790b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1800b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // verify the mock service was properly called
1810b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        verify(mockServiceInterface);
1820b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
1830b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1840b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    @MediumTest
1850b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    public void testSendAccessibilityEvent_AccessibilityDisabled() throws Exception {
1860b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // create an event to be dispatched
1870b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        AccessibilityEvent sentEvent = AccessibilityEvent.obtain();
1880b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1890b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // configure the mock service behavior
1900b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        IAccessibilityManager mockServiceInterface = mMockServiceInterface;
19158d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        expect(mockServiceInterface.addClient(anyIAccessibilityManagerClient(),
19258d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER)).andReturn(0);
1930b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        replay(mockServiceInterface);
1940b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
1950b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // invoke the method under test (accessibility disabled)
19658d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov        AccessibilityManager manager = new AccessibilityManager(mContext, mockServiceInterface,
19758d37b55bd228032355360ea3303e46a804e0516Svetoslav Ganov                UserHandle.USER_OWNER);
1980b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        try {
1990b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            manager.sendAccessibilityEvent(sentEvent);
2000b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            fail("No accessibility events are sent if accessibility is disabled");
2010b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        } catch (IllegalStateException ise) {
2020b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            // check expected result
2030b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            assertEquals("Accessibility off. Did you forget to check that?", ise.getMessage());
2040b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2050b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2060b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        // verify the mock service was properly called
2070b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        verify(mockServiceInterface);
2080b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
2090b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2100b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
2110b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * Determines if an {@link AccessibilityEvent} passed as a method argument
2120b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * matches expectations.
2130b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     *
2140b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * @param matched The event to check.
2150b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * @return True if expectations are matched.
2160b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
2170b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    private static AccessibilityEvent eqAccessibilityEvent(AccessibilityEvent matched) {
2180b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        reportMatcher(new AccessibilityEventMather(matched));
2190b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        return null;
2200b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
2210b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2220b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
2230b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * Determines if an {@link IAccessibilityManagerClient} passed as a method argument
2240b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * matches expectations which in this case are that any instance is accepted.
2250b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     *
2260b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * @return <code>null</code>.
2270b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
2280b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    private static IAccessibilityManagerClient anyIAccessibilityManagerClient() {
2290b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        reportMatcher(new AnyIAccessibilityManagerClientMather());
2300b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        return null;
2310b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
2320b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2330b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
2340b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * Matcher for {@link AccessibilityEvent}s.
2350b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
2360b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    private static class AccessibilityEventMather implements IArgumentMatcher {
2370b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        private AccessibilityEvent mExpectedEvent;
2380b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2390b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        public AccessibilityEventMather(AccessibilityEvent expectedEvent) {
2400b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            mExpectedEvent = expectedEvent;
2410b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2420b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2430b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        public boolean matches(Object matched) {
2440b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            if (!(matched instanceof AccessibilityEvent)) {
2450b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov                return false;
2460b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            }
2470b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            AccessibilityEvent receivedEvent = (AccessibilityEvent) matched;
2480b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            return mExpectedEvent.getEventType() == receivedEvent.getEventType();
2490b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2500b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2510b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        public void appendTo(StringBuffer buffer) {
2520b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            buffer.append("sendAccessibilityEvent()");
2530b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            buffer.append(" with event type \"");
2540b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            buffer.append(mExpectedEvent.getEventType());
2550b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            buffer.append("\"");
2560b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2570b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
2580b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2590b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    /**
2600b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     * Matcher for {@link IAccessibilityManagerClient}s.
2610b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov     */
2620b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    private static class AnyIAccessibilityManagerClientMather implements IArgumentMatcher {
2630b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        public boolean matches(Object matched) {
2640b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            if (!(matched instanceof IAccessibilityManagerClient)) {
2650b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov                return false;
2660b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            }
2670b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            return true;
2680b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2690b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov
2700b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        public void appendTo(StringBuffer buffer) {
2710b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov            buffer.append("addClient() with any IAccessibilityManagerClient");
2720b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov        }
2730b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov    }
2740b29a587142b19ed25dd6489cfa037d06145afd1Svetoslav Ganov}
275