Add A11y Slices
Add AccessibilityPreferenceController, which wraps all a11y settings since they are share common infrastructure for enabling, current value, and availability. We add an overlay for OEMs to declare their bundled a11y services. This is the only list of services that will be possible to enabled via Settings slices. Accessibility Slices are built by getting a list of valid services, and indexing the service names as a key in the Slices DB. When they are built at runtime, they use the generic A11yPrefController to get the status and enable/disable the service. Bug: 67997836 Bug: 67997672 Test: robotests Change-Id: I66f905bf1c55eecb937945c4675c12bcbc96d698
This commit is contained in:
@@ -17,8 +17,22 @@
|
||||
package com.android.settings.slices;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.accessibility.AccessibilitySettings;
|
||||
import com.android.settings.accessibility.AccessibilitySlicePreferenceController;
|
||||
import com.android.settings.search.FakeIndexProvider;
|
||||
import com.android.settings.search.SearchFeatureProvider;
|
||||
import com.android.settings.search.SearchFeatureProviderImpl;
|
||||
@@ -32,17 +46,29 @@ import org.junit.runner.RunWith;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
public class SliceDataConverterTest {
|
||||
|
||||
private final String fakeKey = "key";
|
||||
private final String fakeTitle = "title";
|
||||
private final String fakeSummary = "summary";
|
||||
private final String fakeScreenTitle = "screen_title";
|
||||
private final String fakeFragmentClassName = FakeIndexProvider.class.getName();
|
||||
private final String fakeControllerName = FakePreferenceController.class.getName();
|
||||
private final String FAKE_KEY = "key";
|
||||
private final String FAKE_TITLE = "title";
|
||||
private final String FAKE_SUMMARY = "summary";
|
||||
private final String FAKE_SCREEN_TITLE = "screen_title";
|
||||
private final String FAKE_FRAGMENT_CLASSNAME = FakeIndexProvider.class.getName();
|
||||
private final String FAKE_CONTROLLER_NAME = FakePreferenceController.class.getName();
|
||||
|
||||
private final String ACCESSIBILITY_FRAGMENT = AccessibilitySettings.class.getName();
|
||||
private final String A11Y_CONTROLLER_NAME =
|
||||
AccessibilitySlicePreferenceController.class.getName();
|
||||
private final String FAKE_SERVICE_NAME = "fake_service";
|
||||
private final String FAKE_ACCESSIBILITY_PACKAGE = "fake_package";
|
||||
private final String FAKE_A11Y_SERVICE_NAME =
|
||||
FAKE_ACCESSIBILITY_PACKAGE + "/" + FAKE_SERVICE_NAME;
|
||||
private final int FAKE_ICON = 1234;
|
||||
|
||||
private Context mContext;
|
||||
|
||||
private SliceDataConverter mSliceDataConverter;
|
||||
private SearchFeatureProvider mSearchFeatureProvider;
|
||||
@@ -50,7 +76,8 @@ public class SliceDataConverterTest {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mSliceDataConverter = new SliceDataConverter(RuntimeEnvironment.application);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mSliceDataConverter = spy(new SliceDataConverter(RuntimeEnvironment.application));
|
||||
mSearchFeatureProvider = new SearchFeatureProviderImpl();
|
||||
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider;
|
||||
@@ -68,20 +95,64 @@ public class SliceDataConverterTest {
|
||||
mSearchFeatureProvider.getSearchIndexableResources().getProviderValues()
|
||||
.add(FakeIndexProvider.class);
|
||||
|
||||
doReturn(getFakeService()).when(mSliceDataConverter).getAccessibilityServiceInfoList();
|
||||
|
||||
List<SliceData> sliceDataList = mSliceDataConverter.getSliceData();
|
||||
|
||||
assertThat(sliceDataList).hasSize(1);
|
||||
SliceData fakeSlice = sliceDataList.get(0);
|
||||
assertThat(sliceDataList).hasSize(2);
|
||||
SliceData fakeSlice0 = sliceDataList.get(0);
|
||||
SliceData fakeSlice1 = sliceDataList.get(1);
|
||||
|
||||
assertThat(fakeSlice.getKey()).isEqualTo(fakeKey);
|
||||
assertThat(fakeSlice.getTitle()).isEqualTo(fakeTitle);
|
||||
assertThat(fakeSlice.getSummary()).isEqualTo(fakeSummary);
|
||||
assertThat(fakeSlice.getScreenTitle()).isEqualTo(fakeScreenTitle);
|
||||
// Should not assume the order of the data list.
|
||||
if (TextUtils.equals(fakeSlice0.getKey(), FAKE_KEY)) {
|
||||
assertFakeSlice(fakeSlice0);
|
||||
assertFakeA11ySlice(fakeSlice1);
|
||||
} else {
|
||||
assertFakeSlice(fakeSlice1);
|
||||
assertFakeA11ySlice(fakeSlice0);
|
||||
}
|
||||
}
|
||||
|
||||
private void assertFakeSlice(SliceData fakeSlice) {
|
||||
assertThat(fakeSlice.getKey()).isEqualTo(FAKE_KEY);
|
||||
assertThat(fakeSlice.getTitle()).isEqualTo(FAKE_TITLE);
|
||||
assertThat(fakeSlice.getSummary()).isEqualTo(FAKE_SUMMARY);
|
||||
assertThat(fakeSlice.getScreenTitle()).isEqualTo(FAKE_SCREEN_TITLE);
|
||||
assertThat(fakeSlice.getIconResource()).isNotNull();
|
||||
assertThat(fakeSlice.getUri()).isNull();
|
||||
assertThat(fakeSlice.getFragmentClassName()).isEqualTo(fakeFragmentClassName);
|
||||
assertThat(fakeSlice.getPreferenceController()).isEqualTo(fakeControllerName);
|
||||
assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); // from XML
|
||||
assertThat(fakeSlice.getFragmentClassName()).isEqualTo(FAKE_FRAGMENT_CLASSNAME);
|
||||
assertThat(fakeSlice.getPreferenceController()).isEqualTo(FAKE_CONTROLLER_NAME);
|
||||
assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER);
|
||||
assertThat(fakeSlice.isPlatformDefined()).isTrue(); // from XML
|
||||
}
|
||||
|
||||
private void assertFakeA11ySlice(SliceData fakeSlice) {
|
||||
assertThat(fakeSlice.getKey()).isEqualTo(FAKE_A11Y_SERVICE_NAME);
|
||||
assertThat(fakeSlice.getTitle()).isEqualTo(FAKE_TITLE);
|
||||
assertThat(fakeSlice.getSummary()).isNull();
|
||||
assertThat(fakeSlice.getScreenTitle()).isEqualTo(
|
||||
mContext.getString(R.string.accessibility_settings));
|
||||
assertThat(fakeSlice.getIconResource()).isEqualTo(FAKE_ICON);
|
||||
assertThat(fakeSlice.getUri()).isNull();
|
||||
assertThat(fakeSlice.getFragmentClassName()).isEqualTo(ACCESSIBILITY_FRAGMENT);
|
||||
assertThat(fakeSlice.getPreferenceController()).isEqualTo(A11Y_CONTROLLER_NAME);
|
||||
}
|
||||
|
||||
// This is fragile. Should be replaced by a proper fake Service if possible.
|
||||
private List<AccessibilityServiceInfo> getFakeService() {
|
||||
List<AccessibilityServiceInfo> serviceInfoList = new ArrayList<>();
|
||||
AccessibilityServiceInfo serviceInfo = spy(new AccessibilityServiceInfo());
|
||||
|
||||
ResolveInfo resolveInfo = spy(new ResolveInfo());
|
||||
resolveInfo.serviceInfo = new ServiceInfo();
|
||||
resolveInfo.serviceInfo.name = FAKE_SERVICE_NAME;
|
||||
resolveInfo.serviceInfo.packageName = FAKE_ACCESSIBILITY_PACKAGE;
|
||||
doReturn(FAKE_TITLE).when(resolveInfo).loadLabel(any(PackageManager.class));
|
||||
doReturn(FAKE_ICON).when(resolveInfo).getIconResource();
|
||||
|
||||
doReturn(resolveInfo).when(serviceInfo).getResolveInfo();
|
||||
serviceInfoList.add(serviceInfo);
|
||||
|
||||
return serviceInfoList;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user