Unified service and shortcut state summary on a11y settings page.
Bug: 210026562 Test: manual Test: atest Change-Id: I4d5ff6b10d6bfd2fe6b3de1849d00a9d084bf269
This commit is contained in:
@@ -27,6 +27,8 @@ import android.content.pm.ServiceInfo;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
|
||||
|
||||
@@ -34,33 +36,33 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class AccessibilityUtilTest {
|
||||
private static final int ON = 1;
|
||||
private static final int OFF = 0;
|
||||
private static final String SECURE_TEST_KEY = "secure_test_key";
|
||||
private static final String DUMMY_PACKAGE_NAME = "com.mock.example";
|
||||
private static final String DUMMY_CLASS_NAME = DUMMY_PACKAGE_NAME + ".mock_a11y_service";
|
||||
private static final String DUMMY_CLASS_NAME2 = DUMMY_PACKAGE_NAME + ".mock_a11y_service2";
|
||||
private static final ComponentName DUMMY_COMPONENT_NAME = new ComponentName(DUMMY_PACKAGE_NAME,
|
||||
DUMMY_CLASS_NAME);
|
||||
private static final ComponentName DUMMY_COMPONENT_NAME2 = new ComponentName(DUMMY_PACKAGE_NAME,
|
||||
DUMMY_CLASS_NAME2);
|
||||
private static final String MOCK_PACKAGE_NAME = "com.mock.example";
|
||||
private static final String MOCK_CLASS_NAME = MOCK_PACKAGE_NAME + ".mock_a11y_service";
|
||||
private static final String MOCK_CLASS_NAME2 = MOCK_PACKAGE_NAME + ".mock_a11y_service2";
|
||||
private static final ComponentName MOCK_COMPONENT_NAME = new ComponentName(MOCK_PACKAGE_NAME,
|
||||
MOCK_CLASS_NAME);
|
||||
private static final ComponentName MOCK_COMPONENT_NAME2 = new ComponentName(MOCK_PACKAGE_NAME,
|
||||
MOCK_CLASS_NAME2);
|
||||
private static final String SOFTWARE_SHORTCUT_KEY =
|
||||
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
|
||||
private static final String HARDWARE_SHORTCUT_KEY =
|
||||
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
|
||||
|
||||
private static final String PLACEHOLDER_SETTING_FEATURE = "placeholderSettingFeature";
|
||||
|
||||
private Context mContext;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mContext = ApplicationProvider.getApplicationContext();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,30 +77,33 @@ public final class AccessibilityUtilTest {
|
||||
|
||||
@Test
|
||||
public void getSummary_hasValueAndEqualsToOne_shouldReturnOnString() {
|
||||
Settings.Secure.putInt(mContext.getContentResolver(), SECURE_TEST_KEY, ON);
|
||||
setSettingsFeatureEnabled(SECURE_TEST_KEY, true);
|
||||
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY);
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY,
|
||||
R.string.switch_on_text, R.string.switch_off_text);
|
||||
|
||||
assertThat(result)
|
||||
.isEqualTo(mContext.getText(R.string.accessibility_feature_state_on));
|
||||
.isEqualTo(mContext.getText(R.string.switch_on_text));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_hasValueAndEqualsToZero_shouldReturnOffString() {
|
||||
Settings.Secure.putInt(mContext.getContentResolver(), SECURE_TEST_KEY, OFF);
|
||||
setSettingsFeatureEnabled(SECURE_TEST_KEY, false);
|
||||
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY);
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY,
|
||||
R.string.switch_on_text, R.string.switch_off_text);
|
||||
|
||||
assertThat(result)
|
||||
.isEqualTo(mContext.getText(R.string.accessibility_feature_state_off));
|
||||
.isEqualTo(mContext.getText(R.string.switch_off_text));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_noValue_shouldReturnOffString() {
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY);
|
||||
final CharSequence result = AccessibilityUtil.getSummary(mContext, SECURE_TEST_KEY,
|
||||
R.string.switch_on_text, R.string.switch_off_text);
|
||||
|
||||
assertThat(result)
|
||||
.isEqualTo(mContext.getText(R.string.accessibility_feature_state_off));
|
||||
.isEqualTo(mContext.getText(R.string.switch_off_text));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -136,29 +141,31 @@ public final class AccessibilityUtilTest {
|
||||
|
||||
@Test
|
||||
public void hasValueInSettings_putValue_hasValue() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
assertThat(AccessibilityUtil.hasValueInSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME)).isTrue();
|
||||
MOCK_COMPONENT_NAME)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserShortcutTypeFromSettings_putOneValue_hasValue() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
final int shortcutType = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
|
||||
DUMMY_COMPONENT_NAME);
|
||||
MOCK_COMPONENT_NAME);
|
||||
|
||||
assertThat(
|
||||
(shortcutType & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getUserShortcutTypeFromSettings_putTwoValues_hasValue() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
putStringIntoSettings(HARDWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
final int shortcutType = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
|
||||
DUMMY_COMPONENT_NAME);
|
||||
MOCK_COMPONENT_NAME);
|
||||
|
||||
assertThat(
|
||||
(shortcutType & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE).isTrue();
|
||||
assertThat(
|
||||
@@ -167,50 +174,53 @@ public final class AccessibilityUtilTest {
|
||||
|
||||
@Test
|
||||
public void optInAllValuesToSettings_optInValue_haveMatchString() {
|
||||
clearShortcuts();
|
||||
int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE;
|
||||
|
||||
AccessibilityUtil.optInAllValuesToSettings(mContext, shortcutTypes, DUMMY_COMPONENT_NAME);
|
||||
AccessibilityUtil.optInAllValuesToSettings(mContext, shortcutTypes, MOCK_COMPONENT_NAME);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo(
|
||||
DUMMY_COMPONENT_NAME.flattenToString());
|
||||
MOCK_COMPONENT_NAME.flattenToString());
|
||||
assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEqualTo(
|
||||
DUMMY_COMPONENT_NAME.flattenToString());
|
||||
MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optInValueToSettings_optInValue_haveMatchString() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
AccessibilityUtil.optInValueToSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME2);
|
||||
MOCK_COMPONENT_NAME2);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo(
|
||||
DUMMY_COMPONENT_NAME.flattenToString() + ":"
|
||||
+ DUMMY_COMPONENT_NAME2.flattenToString());
|
||||
MOCK_COMPONENT_NAME.flattenToString() + ":"
|
||||
+ MOCK_COMPONENT_NAME2.flattenToString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optInValueToSettings_optInTwoValues_haveMatchString() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
AccessibilityUtil.optInValueToSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME2);
|
||||
MOCK_COMPONENT_NAME2);
|
||||
AccessibilityUtil.optInValueToSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME2);
|
||||
MOCK_COMPONENT_NAME2);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo(
|
||||
DUMMY_COMPONENT_NAME.flattenToString() + ":"
|
||||
+ DUMMY_COMPONENT_NAME2.flattenToString());
|
||||
MOCK_COMPONENT_NAME.flattenToString() + ":"
|
||||
+ MOCK_COMPONENT_NAME2.flattenToString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optOutAllValuesToSettings_optOutValue_emptyString() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
putStringIntoSettings(HARDWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
int shortcutTypes =
|
||||
UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE | UserShortcutType.TRIPLETAP;
|
||||
|
||||
AccessibilityUtil.optOutAllValuesFromSettings(mContext, shortcutTypes,
|
||||
DUMMY_COMPONENT_NAME);
|
||||
MOCK_COMPONENT_NAME);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEmpty();
|
||||
assertThat(getStringFromSettings(HARDWARE_SHORTCUT_KEY)).isEmpty();
|
||||
@@ -218,30 +228,108 @@ public final class AccessibilityUtilTest {
|
||||
|
||||
@Test
|
||||
public void optOutValueFromSettings_optOutValue_emptyString() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
|
||||
AccessibilityUtil.optOutValueFromSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME);
|
||||
MOCK_COMPONENT_NAME);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optOutValueFromSettings_optOutValue_haveMatchString() {
|
||||
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, DUMMY_COMPONENT_NAME.flattenToString() + ":"
|
||||
+ DUMMY_COMPONENT_NAME2.flattenToString());
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString(),
|
||||
MOCK_COMPONENT_NAME2.flattenToString());
|
||||
|
||||
AccessibilityUtil.optOutValueFromSettings(mContext, UserShortcutType.SOFTWARE,
|
||||
DUMMY_COMPONENT_NAME2);
|
||||
MOCK_COMPONENT_NAME2);
|
||||
|
||||
assertThat(getStringFromSettings(SOFTWARE_SHORTCUT_KEY)).isEqualTo(
|
||||
DUMMY_COMPONENT_NAME.flattenToString());
|
||||
MOCK_COMPONENT_NAME.flattenToString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFeatureFullStateSummary_featureOffShortcutOff_showsOffShortcutOffAndSummary() {
|
||||
setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, false);
|
||||
clearShortcuts();
|
||||
String expectedText = mContext.getString(
|
||||
R.string.accessibility_feature_full_state_summary,
|
||||
mContext.getString(R.string.color_inversion_state_off),
|
||||
mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
|
||||
mContext.getString(R.string.color_inversion_feature_summary));
|
||||
|
||||
String observerText = AccessibilityUtil.getFeatureFullStateSummary(
|
||||
mContext, MOCK_COMPONENT_NAME,
|
||||
PLACEHOLDER_SETTING_FEATURE,
|
||||
R.string.color_inversion_state_on, R.string.color_inversion_state_off,
|
||||
R.string.color_inversion_feature_summary).toString();
|
||||
|
||||
assertThat(observerText).isEqualTo(expectedText);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFeatureFullStateSummary_featureOnShortcutOff_showsOnShortcutOffAndSummary() {
|
||||
setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, true);
|
||||
clearShortcuts();
|
||||
String expectedText = mContext.getString(
|
||||
R.string.accessibility_feature_full_state_summary,
|
||||
mContext.getString(R.string.color_inversion_state_on),
|
||||
mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
|
||||
mContext.getString(R.string.color_inversion_feature_summary));
|
||||
|
||||
String observerText = AccessibilityUtil.getFeatureFullStateSummary(
|
||||
mContext, MOCK_COMPONENT_NAME,
|
||||
PLACEHOLDER_SETTING_FEATURE,
|
||||
R.string.color_inversion_state_on, R.string.color_inversion_state_off,
|
||||
R.string.color_inversion_feature_summary).toString();
|
||||
|
||||
assertThat(observerText).isEqualTo(expectedText);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFeatureFullStateSummary_featureOffShortcutOn_showsOffShortcutOnAndSummary() {
|
||||
setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, false);
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
String expectedText = mContext.getString(
|
||||
R.string.accessibility_feature_full_state_summary,
|
||||
mContext.getString(R.string.color_inversion_state_off),
|
||||
mContext.getString(R.string.accessibility_summary_shortcut_enabled),
|
||||
mContext.getString(R.string.color_inversion_feature_summary));
|
||||
|
||||
String observerText = AccessibilityUtil.getFeatureFullStateSummary(
|
||||
mContext, MOCK_COMPONENT_NAME,
|
||||
PLACEHOLDER_SETTING_FEATURE,
|
||||
R.string.color_inversion_state_on, R.string.color_inversion_state_off,
|
||||
R.string.color_inversion_feature_summary).toString();
|
||||
|
||||
assertThat(observerText).isEqualTo(expectedText);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFeatureFullStateSummary_featureOnShortcutOn_showsOnShortcutOnAndSummary() {
|
||||
setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, true);
|
||||
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
|
||||
String expectedText = mContext.getString(
|
||||
R.string.accessibility_feature_full_state_summary,
|
||||
mContext.getString(R.string.color_inversion_state_on),
|
||||
mContext.getString(R.string.accessibility_summary_shortcut_enabled),
|
||||
mContext.getString(R.string.color_inversion_feature_summary));
|
||||
|
||||
String observerText = AccessibilityUtil.getFeatureFullStateSummary(
|
||||
mContext, MOCK_COMPONENT_NAME,
|
||||
PLACEHOLDER_SETTING_FEATURE,
|
||||
R.string.color_inversion_state_on, R.string.color_inversion_state_off,
|
||||
R.string.color_inversion_feature_summary).toString();
|
||||
|
||||
assertThat(observerText).isEqualTo(expectedText);
|
||||
}
|
||||
|
||||
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
|
||||
final ApplicationInfo applicationInfo = new ApplicationInfo();
|
||||
final ServiceInfo serviceInfo = new ServiceInfo();
|
||||
applicationInfo.packageName = DUMMY_PACKAGE_NAME;
|
||||
serviceInfo.packageName = DUMMY_PACKAGE_NAME;
|
||||
serviceInfo.name = DUMMY_CLASS_NAME;
|
||||
applicationInfo.packageName = MOCK_PACKAGE_NAME;
|
||||
serviceInfo.packageName = MOCK_PACKAGE_NAME;
|
||||
serviceInfo.name = MOCK_CLASS_NAME;
|
||||
serviceInfo.applicationInfo = applicationInfo;
|
||||
|
||||
final ResolveInfo resolveInfo = new ResolveInfo();
|
||||
@@ -250,7 +338,7 @@ public final class AccessibilityUtilTest {
|
||||
try {
|
||||
final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
|
||||
mContext);
|
||||
info.setComponentName(DUMMY_COMPONENT_NAME);
|
||||
info.setComponentName(MOCK_COMPONENT_NAME);
|
||||
return info;
|
||||
} catch (XmlPullParserException | IOException e) {
|
||||
// Do nothing
|
||||
@@ -259,11 +347,28 @@ public final class AccessibilityUtilTest {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void putStringIntoSettings(String key, String componentName) {
|
||||
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
|
||||
}
|
||||
|
||||
private String getStringFromSettings(String key) {
|
||||
return Settings.Secure.getString(mContext.getContentResolver(), key);
|
||||
}
|
||||
|
||||
private void setSettingsFeatureEnabled(String settingsKey, boolean enabled) {
|
||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||
settingsKey,
|
||||
enabled ? AccessibilityUtil.State.ON : AccessibilityUtil.State.OFF);
|
||||
}
|
||||
|
||||
private void setShortcut(@UserShortcutType int shortcutType, String... componentNames) {
|
||||
StringJoiner shortcutComponents = new StringJoiner(":");
|
||||
for (String componentName : componentNames) {
|
||||
shortcutComponents.add(componentName);
|
||||
}
|
||||
Settings.Secure.putString(mContext.getContentResolver(),
|
||||
shortcutType == UserShortcutType.SOFTWARE ? SOFTWARE_SHORTCUT_KEY
|
||||
: HARDWARE_SHORTCUT_KEY, shortcutComponents.toString());
|
||||
}
|
||||
|
||||
private void clearShortcuts() {
|
||||
Settings.Secure.putString(mContext.getContentResolver(), SOFTWARE_SHORTCUT_KEY, "");
|
||||
Settings.Secure.putString(mContext.getContentResolver(), HARDWARE_SHORTCUT_KEY, "");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user