Checks that prebundled categories contain only preinstalled contents.

Bug: 353888087
Test: atest AccessibilitySettingsTest
Test: manually check all prebundled services are still in their proper
      groups, even after installing an APK update
Flag: com.android.settings.accessibility.check_prebundled_is_preinstalled
Change-Id: I023db9c37d7990deb50c9eec516619f0a8db65b7
This commit is contained in:
Daniel Norman
2024-07-20 00:46:50 +00:00
parent 51bb0fe4e4
commit 20d2eabe35
3 changed files with 87 additions and 40 deletions

View File

@@ -26,11 +26,9 @@ import static org.robolectric.Shadows.shadowOf;
import static java.util.Collections.singletonList;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityShortcutInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
@@ -110,9 +108,7 @@ public class AccessibilitySettingsTest {
private final Context mContext = ApplicationProvider.getApplicationContext();
@Spy
private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo(
PACKAGE_NAME, CLASS_NAME);
@Mock
private AccessibilityShortcutInfo mShortcutInfo;
new ComponentName(PACKAGE_NAME, CLASS_NAME));
private ShadowAccessibilityManager mShadowAccessibilityManager;
@Mock
private LocalBluetoothManager mLocalBluetoothManager;
@@ -125,7 +121,6 @@ public class AccessibilitySettingsTest {
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat);
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
setMockAccessibilityShortcutInfo(mShortcutInfo);
Intent intent = new Intent();
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT,
@@ -398,14 +393,25 @@ public class AccessibilitySettingsTest {
public void testAccessibilityMenuInSystem_IncludedInInteractionControl() {
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
List.of(getMockAccessibilityServiceInfo(
AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM)));
AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM,
/*isSystemApp=*/true)));
setupFragment();
final RestrictedPreference pref = mFragment.getPreferenceScreen().findPreference(
AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM.flattenToString());
final String prefCategory = mFragment.mServicePreferenceToPreferenceCategoryMap.get(
pref).getKey();
assertThat(prefCategory).isEqualTo(AccessibilitySettings.CATEGORY_INTERACTION_CONTROL);
assertThat(getPreferenceCategory(AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM))
.isEqualTo(AccessibilitySettings.CATEGORY_INTERACTION_CONTROL);
}
@Test
@EnableFlags(com.android.settings.accessibility.Flags.FLAG_CHECK_PREBUNDLED_IS_PREINSTALLED)
public void testNonPreinstalledApp_IncludedInDownloadedCategory() {
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
List.of(getMockAccessibilityServiceInfo(
AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM,
/*isSystemApp=*/false)));
setupFragment();
assertThat(getPreferenceCategory(AccessibilityUtils.ACCESSIBILITY_MENU_IN_SYSTEM))
.isEqualTo(AccessibilitySettings.CATEGORY_DOWNLOADED_SERVICES);
}
@Test
@@ -418,13 +424,20 @@ public class AccessibilitySettingsTest {
assertThat(pref).isNull();
}
private AccessibilityServiceInfo getMockAccessibilityServiceInfo(String packageName,
String className) {
return getMockAccessibilityServiceInfo(new ComponentName(packageName, className));
private String getPreferenceCategory(ComponentName componentName) {
return mFragment.mServicePreferenceToPreferenceCategoryMap.get(
mFragment.getPreferenceScreen().findPreference(
componentName.flattenToString())).getKey();
}
private AccessibilityServiceInfo getMockAccessibilityServiceInfo(ComponentName componentName) {
final ApplicationInfo applicationInfo = new ApplicationInfo();
return getMockAccessibilityServiceInfo(componentName, true);
}
private AccessibilityServiceInfo getMockAccessibilityServiceInfo(ComponentName componentName,
boolean isSystemApp) {
final ApplicationInfo applicationInfo = Mockito.mock(ApplicationInfo.class);
when(applicationInfo.isSystemApp()).thenReturn(isSystemApp);
final ServiceInfo serviceInfo = new ServiceInfo();
applicationInfo.packageName = componentName.getPackageName();
serviceInfo.packageName = componentName.getPackageName();
@@ -445,16 +458,6 @@ public class AccessibilitySettingsTest {
return null;
}
private void setMockAccessibilityShortcutInfo(AccessibilityShortcutInfo mockInfo) {
final ActivityInfo activityInfo = Mockito.mock(ActivityInfo.class);
activityInfo.applicationInfo = new ApplicationInfo();
when(mockInfo.getActivityInfo()).thenReturn(activityInfo);
when(activityInfo.loadLabel(any())).thenReturn(DEFAULT_LABEL);
when(mockInfo.loadSummary(any())).thenReturn(DEFAULT_SUMMARY);
when(mockInfo.loadDescription(any())).thenReturn(DEFAULT_DESCRIPTION);
when(mockInfo.getComponentName()).thenReturn(COMPONENT_NAME);
}
private void setInvisibleToggleFragmentType(AccessibilityServiceInfo info) {
info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;