• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.android.settings.core.BasePreferenceController.AVAILABLE;
20 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
21 
22 import static com.google.common.truth.Truth.assertThat;
23 
24 import android.accessibilityservice.AccessibilityServiceInfo;
25 import android.content.ComponentName;
26 import android.content.ContentResolver;
27 import android.content.Context;
28 import android.content.pm.ResolveInfo;
29 import android.content.pm.ServiceInfo;
30 import android.provider.Settings;
31 import android.view.accessibility.AccessibilityManager;
32 
33 import com.android.settings.testutils.SettingsRobolectricTestRunner;
34 import com.android.settingslib.accessibility.AccessibilityUtils;
35 
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.robolectric.RuntimeEnvironment;
40 
41 import java.io.IOException;
42 import java.util.ArrayList;
43 import java.util.List;
44 
45 import org.robolectric.shadow.api.Shadow;
46 import org.robolectric.shadows.ShadowAccessibilityManager;
47 import org.xmlpull.v1.XmlPullParserException;
48 
49 @RunWith(SettingsRobolectricTestRunner.class)
50 public class AccessibilitySlicePreferenceControllerTest {
51 
52     private final String PACKAGE_NAME = "com.android.settings.fake";
53     private final String CLASS_NAME = "com.android.settings.fake.classname";
54     private final String SERVICE_NAME = PACKAGE_NAME + "/" + CLASS_NAME;
55 
56     private Context mContext;
57 
58     private AccessibilitySlicePreferenceController mController;
59 
60     @Before
setUp()61     public void setUp() {
62         mContext = RuntimeEnvironment.application;
63 
64         final ContentResolver contentResolver = mContext.getContentResolver();
65         Settings.Secure.putInt(contentResolver, Settings.Secure.ACCESSIBILITY_ENABLED, 1 /* on */);
66         Settings.Secure.putString(contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
67                 SERVICE_NAME);
68 
69         // Register the fake a11y Service
70         ShadowAccessibilityManager shadowAccessibilityManager = Shadow.extract(
71                 RuntimeEnvironment.application.getSystemService(AccessibilityManager.class));
72         shadowAccessibilityManager.setInstalledAccessibilityServiceList(getFakeServiceList());
73 
74         mController = new AccessibilitySlicePreferenceController(mContext, SERVICE_NAME);
75     }
76 
77     @Test
getAvailability_availableService_returnsAvailable()78     public void getAvailability_availableService_returnsAvailable() {
79         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
80     }
81 
82     @Test
getAvailability_unknownService_returnsUnsupported()83     public void getAvailability_unknownService_returnsUnsupported() {
84         AccessibilitySlicePreferenceController controller =
85                 new AccessibilitySlicePreferenceController(mContext, "fake_service/name");
86 
87         assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
88     }
89 
90     @Test
setChecked_availableService_serviceIsEnabled()91     public void setChecked_availableService_serviceIsEnabled() {
92         mController.setChecked(true);
93 
94         assertThat(mController.isChecked()).isTrue();
95     }
96 
97     @Test
setNotChecked_availableService_serviceIsDisabled()98     public void setNotChecked_availableService_serviceIsDisabled() {
99         mController.setChecked(false);
100 
101         assertThat(mController.isChecked()).isFalse();
102     }
103 
104     @Test
isChecked_serviceEnabled_returnsTrue()105     public void isChecked_serviceEnabled_returnsTrue() {
106         AccessibilityUtils.setAccessibilityServiceState(mContext,
107                 ComponentName.unflattenFromString(mController.getPreferenceKey()), true);
108 
109         assertThat(mController.isChecked()).isTrue();
110     }
111 
112     @Test
isChecked_serviceNotEnabled_returnsFalse()113     public void isChecked_serviceNotEnabled_returnsFalse() {
114         AccessibilitySlicePreferenceController controller =
115                 new AccessibilitySlicePreferenceController(mContext, "fake_service/name");
116 
117         assertThat(controller.isChecked()).isFalse();
118     }
119 
120     @Test(expected = IllegalArgumentException.class)
illegalServiceName_exceptionThrown()121     public void illegalServiceName_exceptionThrown() {
122         new AccessibilitySlicePreferenceController(mContext, "not_split_by_slash");
123     }
124 
getFakeServiceList()125     private List<AccessibilityServiceInfo> getFakeServiceList() {
126         final List<AccessibilityServiceInfo> infoList = new ArrayList<>();
127 
128         final ServiceInfo serviceInfo = new ServiceInfo();
129         serviceInfo.packageName = PACKAGE_NAME;
130         serviceInfo.name = CLASS_NAME;
131 
132         final ResolveInfo resolveInfo = new ResolveInfo();
133         resolveInfo.serviceInfo = serviceInfo;
134 
135         try {
136             final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
137                     mContext);
138             ComponentName componentName = new ComponentName(PACKAGE_NAME, CLASS_NAME);
139             info.setComponentName(componentName);
140             infoList.add(info);
141         } catch (XmlPullParserException | IOException e) {
142 
143         }
144 
145         return infoList;
146     }
147 }
148