Home | History | Annotate | Download | only in accessibility
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.accessibility;
     18 
     19 import android.accessibilityservice.FingerprintGestureController;
     20 import android.hardware.fingerprint.IFingerprintService;
     21 import android.os.Handler;
     22 import android.os.Message;
     23 import android.view.KeyEvent;
     24 
     25 import com.android.server.accessibility.FingerprintGestureDispatcher.FingerprintGestureClient;
     26 
     27 import org.junit.Before;
     28 import org.junit.Test;
     29 import org.mockito.Mock;
     30 import org.mockito.MockitoAnnotations;
     31 
     32 import java.util.Arrays;
     33 import java.util.Collections;
     34 
     35 import static org.junit.Assert.assertFalse;
     36 import static org.junit.Assert.assertTrue;
     37 import static org.mockito.Matchers.anyBoolean;
     38 import static org.mockito.Matchers.anyInt;
     39 import static org.mockito.Mockito.times;
     40 import static org.mockito.Mockito.verify;
     41 import static org.mockito.Mockito.verifyNoMoreInteractions;
     42 import static org.mockito.Mockito.when;
     43 
     44 /**
     45  * Tests for FingerprintGestureDispatcher
     46  */
     47 public class FingerprintGestureDispatcherTest {
     48 
     49     private @Mock IFingerprintService mMockFingerprintService;
     50     private @Mock FingerprintGestureClient mNonGestureCapturingClient;
     51     private @Mock FingerprintGestureClient mGestureCapturingClient;
     52     private @Mock FingerprintGestureDispatcher mFingerprintGestureDispatcher;
     53     private MessageCapturingHandler mMessageCapturingHandler;
     54 
     55     @Before
     56     public void setup() {
     57         MockitoAnnotations.initMocks(this);
     58         mMessageCapturingHandler = new MessageCapturingHandler(
     59                 msg -> mFingerprintGestureDispatcher.handleMessage(msg));
     60         mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(mMockFingerprintService,
     61                 new Object(), mMessageCapturingHandler);
     62         when(mNonGestureCapturingClient.isCapturingFingerprintGestures()).thenReturn(false);
     63         when(mGestureCapturingClient.isCapturingFingerprintGestures()).thenReturn(true);
     64     }
     65 
     66     @Test
     67     public void testNoServices_doesNotCrashOrConsumeGestures() {
     68         mFingerprintGestureDispatcher.onClientActiveChanged(true);
     69         mFingerprintGestureDispatcher.onClientActiveChanged(false);
     70         assertFalse(mFingerprintGestureDispatcher.onFingerprintGesture(
     71                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP));
     72     }
     73 
     74     @Test
     75     public void testOneNonCapturingService_doesNotCrashOrConsumeGestures() {
     76         mFingerprintGestureDispatcher.updateClientList(
     77                 Arrays.asList(mNonGestureCapturingClient));
     78         mFingerprintGestureDispatcher.onClientActiveChanged(true);
     79         mFingerprintGestureDispatcher.onClientActiveChanged(false);
     80         assertFalse(mFingerprintGestureDispatcher.onFingerprintGesture(
     81                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP));
     82         verify(mNonGestureCapturingClient, times(0))
     83                 .onFingerprintGestureDetectionActiveChanged(anyBoolean());
     84         verify(mNonGestureCapturingClient, times(0)).onFingerprintGesture(anyInt());
     85     }
     86 
     87     @Test
     88     public void testOneCapturingService_notifiesClientOfActivityChanges() {
     89         mFingerprintGestureDispatcher.updateClientList(
     90                 Arrays.asList(mGestureCapturingClient));
     91         mFingerprintGestureDispatcher.onClientActiveChanged(true);
     92         // Client active means gesture detection isn't.
     93         verify(mGestureCapturingClient, times(1)).onFingerprintGestureDetectionActiveChanged(false);
     94         verify(mGestureCapturingClient, times(0)).onFingerprintGestureDetectionActiveChanged(true);
     95         mFingerprintGestureDispatcher.onClientActiveChanged(false);
     96         verify(mGestureCapturingClient, times(1)).onFingerprintGestureDetectionActiveChanged(false);
     97         verify(mGestureCapturingClient, times(1)).onFingerprintGestureDetectionActiveChanged(true);
     98     }
     99 
    100     @Test
    101     public void testOneCapturingService_consumesGesturesAndPassesThemAlong() {
    102         mFingerprintGestureDispatcher.updateClientList(
    103                 Arrays.asList(mGestureCapturingClient));
    104         assertTrue(mFingerprintGestureDispatcher.onFingerprintGesture(
    105                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP));
    106         verify(mGestureCapturingClient, times(1)).onFingerprintGesture(
    107                 FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_UP);
    108         assertTrue(mFingerprintGestureDispatcher.onFingerprintGesture(
    109                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN));
    110         verify(mGestureCapturingClient, times(1)).onFingerprintGesture(
    111                 FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_DOWN);
    112         assertTrue(mFingerprintGestureDispatcher.onFingerprintGesture(
    113                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT));
    114         verify(mGestureCapturingClient, times(1)).onFingerprintGesture(
    115                 FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_LEFT);
    116         assertTrue(mFingerprintGestureDispatcher.onFingerprintGesture(
    117                 KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT));
    118         verify(mGestureCapturingClient, times(1)).onFingerprintGesture(
    119                 FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_RIGHT);
    120     }
    121 
    122     @Test
    123     public void testInvalidKeyCodes_areNotCaptured() {
    124         mFingerprintGestureDispatcher.updateClientList(
    125                 Arrays.asList(mGestureCapturingClient));
    126         assertFalse(mFingerprintGestureDispatcher.onFingerprintGesture(
    127                 KeyEvent.KEYCODE_SPACE));
    128         verify(mGestureCapturingClient, times(0)).onFingerprintGesture(anyInt());
    129     }
    130 
    131     @Test
    132     public void testWithCapturingService_registersForFingerprintUpdates() throws Exception {
    133         verifyNoMoreInteractions(mMockFingerprintService);
    134         mFingerprintGestureDispatcher.updateClientList(
    135                 Arrays.asList(mGestureCapturingClient));
    136         mMessageCapturingHandler.sendOneMessage();
    137         verify(mMockFingerprintService).addClientActiveCallback(mFingerprintGestureDispatcher);
    138     }
    139 
    140     @Test
    141     public void testWhenCapturingServiceStops_unregistersForFingerprintUpdates() throws Exception {
    142         verifyNoMoreInteractions(mMockFingerprintService);
    143         mFingerprintGestureDispatcher.updateClientList(
    144                 Arrays.asList(mGestureCapturingClient));
    145         mMessageCapturingHandler.sendOneMessage();
    146         mFingerprintGestureDispatcher.updateClientList(Collections.emptyList());
    147         mMessageCapturingHandler.sendOneMessage();
    148         verify(mMockFingerprintService).removeClientActiveCallback(mFingerprintGestureDispatcher);
    149     }
    150 
    151     @Test
    152     public void testIsGestureDetectionActive_dependsOnFingerprintService() throws Exception {
    153         when(mMockFingerprintService.isClientActive()).thenReturn(true);
    154         assertFalse(mFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable());
    155         when(mMockFingerprintService.isClientActive()).thenReturn(false);
    156         assertTrue(mFingerprintGestureDispatcher.isFingerprintGestureDetectionAvailable());
    157     }
    158 }
    159