1 /* 2 * Copyright (C) 2023 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.settings.testutils; 18 19 import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; 20 import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; 21 import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; 22 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; 23 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; 24 25 import static org.mockito.Mockito.mock; 26 import static org.mockito.Mockito.when; 27 28 import android.accessibilityservice.AccessibilityServiceInfo; 29 import android.content.ComponentName; 30 import android.content.Context; 31 import android.content.pm.ApplicationInfo; 32 import android.content.pm.ResolveInfo; 33 import android.content.pm.ServiceInfo; 34 import android.os.Build; 35 import android.provider.Settings; 36 import android.view.accessibility.AccessibilityManager; 37 38 import org.xmlpull.v1.XmlPullParserException; 39 40 import java.io.IOException; 41 42 /** 43 * Utility class for common methods used in the accessibility feature related tests 44 */ 45 public class AccessibilityTestUtils { 46 setSoftwareShortcutMode( Context context, boolean gestureNavEnabled, boolean floatingButtonEnabled)47 public static void setSoftwareShortcutMode( 48 Context context, boolean gestureNavEnabled, boolean floatingButtonEnabled) { 49 int buttonMode = ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; 50 if (floatingButtonEnabled) { 51 buttonMode = ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; 52 } else if (gestureNavEnabled) { 53 buttonMode = ACCESSIBILITY_BUTTON_MODE_GESTURE; 54 } 55 int navMode = gestureNavEnabled ? NAV_BAR_MODE_GESTURAL : NAV_BAR_MODE_3BUTTON; 56 57 Settings.Secure.putIntForUser(context.getContentResolver(), 58 Settings.Secure.ACCESSIBILITY_BUTTON_MODE, buttonMode, context.getUserId()); 59 Settings.Secure.putIntForUser(context.getContentResolver(), 60 Settings.Secure.NAVIGATION_MODE, navMode, context.getUserId()); 61 } 62 63 /** 64 * Returns a mock {@link AccessibilityManager} 65 */ setupMockAccessibilityManager(Context mockContext)66 public static AccessibilityManager setupMockAccessibilityManager(Context mockContext) { 67 AccessibilityManager am = mock(AccessibilityManager.class); 68 when(mockContext.getSystemService(AccessibilityManager.class)).thenReturn(am); 69 return am; 70 } 71 createAccessibilityServiceInfo( Context context, ComponentName componentName, boolean isAlwaysOnService)72 public static AccessibilityServiceInfo createAccessibilityServiceInfo( 73 Context context, ComponentName componentName, boolean isAlwaysOnService) { 74 final ApplicationInfo applicationInfo = new ApplicationInfo(); 75 applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; 76 final ServiceInfo serviceInfo = new ServiceInfo(); 77 applicationInfo.packageName = componentName.getPackageName(); 78 serviceInfo.packageName = componentName.getPackageName(); 79 serviceInfo.name = componentName.getClassName(); 80 serviceInfo.applicationInfo = applicationInfo; 81 82 final ResolveInfo resolveInfo = new ResolveInfo(); 83 resolveInfo.serviceInfo = serviceInfo; 84 try { 85 final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo, 86 context); 87 info.setComponentName(componentName); 88 if (isAlwaysOnService) { 89 info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON; 90 } 91 return info; 92 } catch (XmlPullParserException | IOException e) { 93 // Do nothing 94 } 95 return null; 96 } 97 } 98