1 /* 2 * Copyright (C) 2022 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.accessibility; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.ArgumentMatchers.any; 22 import static org.mockito.Mockito.when; 23 24 import static java.util.Collections.singletonList; 25 26 import android.accessibilityservice.AccessibilityServiceInfo; 27 import android.accessibilityservice.AccessibilityShortcutInfo; 28 import android.content.ComponentName; 29 import android.content.Context; 30 import android.content.pm.ActivityInfo; 31 import android.content.pm.ApplicationInfo; 32 import android.content.pm.ResolveInfo; 33 import android.content.pm.ServiceInfo; 34 35 import androidx.test.core.app.ApplicationProvider; 36 37 import com.android.settingslib.RestrictedPreference; 38 39 import org.junit.Rule; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.Mock; 43 import org.mockito.Mockito; 44 import org.mockito.Spy; 45 import org.mockito.junit.MockitoJUnit; 46 import org.mockito.junit.MockitoRule; 47 import org.robolectric.RobolectricTestRunner; 48 import org.xmlpull.v1.XmlPullParserException; 49 50 import java.io.IOException; 51 import java.util.ArrayList; 52 import java.util.List; 53 54 /** Test for {@link RestrictedPreferenceHelper}. */ 55 @RunWith(RobolectricTestRunner.class) 56 public class RestrictedPreferenceHelperTest { 57 58 private static final String PACKAGE_NAME = "com.android.test"; 59 private static final String CLASS_NAME = PACKAGE_NAME + ".test_a11y_service"; 60 private static final ComponentName COMPONENT_NAME = new ComponentName(PACKAGE_NAME, CLASS_NAME); 61 private static final String DEFAULT_SUMMARY = "default summary"; 62 private static final String DEFAULT_DESCRIPTION = "default description"; 63 private static final String DEFAULT_LABEL = "default label"; 64 65 @Rule 66 public final MockitoRule mocks = MockitoJUnit.rule(); 67 private final Context mContext = ApplicationProvider.getApplicationContext(); 68 @Spy 69 private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo( 70 PACKAGE_NAME, CLASS_NAME); 71 @Mock 72 private AccessibilityShortcutInfo mShortcutInfo; 73 private final RestrictedPreferenceHelper mHelper = new RestrictedPreferenceHelper(mContext); 74 75 @Test createAccessibilityServicePreferenceList_hasOneInfo_containsSameKey()76 public void createAccessibilityServicePreferenceList_hasOneInfo_containsSameKey() { 77 final String key = COMPONENT_NAME.flattenToString(); 78 final List<AccessibilityServiceInfo> infoList = new ArrayList<>( 79 singletonList(mServiceInfo)); 80 81 final List<RestrictedPreference> preferenceList = 82 mHelper.createAccessibilityServicePreferenceList(infoList); 83 final RestrictedPreference preference = preferenceList.get(0); 84 85 assertThat(preference.getKey()).isEqualTo(key); 86 } 87 88 @Test createAccessibilityActivityPreferenceList_hasOneInfo_containsSameKey()89 public void createAccessibilityActivityPreferenceList_hasOneInfo_containsSameKey() { 90 final String key = COMPONENT_NAME.flattenToString(); 91 setMockAccessibilityShortcutInfo(mShortcutInfo); 92 final List<AccessibilityShortcutInfo> infoList = new ArrayList<>( 93 singletonList(mShortcutInfo)); 94 95 final List<RestrictedPreference> preferenceList = 96 mHelper.createAccessibilityActivityPreferenceList(infoList); 97 final RestrictedPreference preference = preferenceList.get(0); 98 99 assertThat(preference.getKey()).isEqualTo(key); 100 } 101 getMockAccessibilityServiceInfo(String packageName, String className)102 private AccessibilityServiceInfo getMockAccessibilityServiceInfo(String packageName, 103 String className) { 104 final ApplicationInfo applicationInfo = new ApplicationInfo(); 105 final ServiceInfo serviceInfo = new ServiceInfo(); 106 applicationInfo.packageName = packageName; 107 serviceInfo.packageName = packageName; 108 serviceInfo.name = className; 109 serviceInfo.applicationInfo = applicationInfo; 110 111 final ResolveInfo resolveInfo = new ResolveInfo(); 112 resolveInfo.serviceInfo = serviceInfo; 113 try { 114 final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo, 115 mContext); 116 info.setComponentName(new ComponentName(packageName, className)); 117 return info; 118 } catch (XmlPullParserException | IOException e) { 119 // Do nothing 120 } 121 return null; 122 } 123 setMockAccessibilityShortcutInfo(AccessibilityShortcutInfo mockInfo)124 private void setMockAccessibilityShortcutInfo(AccessibilityShortcutInfo mockInfo) { 125 final ActivityInfo activityInfo = Mockito.mock(ActivityInfo.class); 126 activityInfo.applicationInfo = new ApplicationInfo(); 127 when(mockInfo.getActivityInfo()).thenReturn(activityInfo); 128 when(activityInfo.loadLabel(any())).thenReturn(DEFAULT_LABEL); 129 when(mockInfo.loadSummary(any())).thenReturn(DEFAULT_SUMMARY); 130 when(mockInfo.loadDescription(any())).thenReturn(DEFAULT_DESCRIPTION); 131 when(mockInfo.getComponentName()).thenReturn(COMPONENT_NAME); 132 } 133 } 134