Merge "Cleanup of AccessibilityUtil#hasValueInSettings" into main

This commit is contained in:
Riley Jones
2024-12-18 12:04:56 -08:00
committed by Android (Google) Code Review
10 changed files with 56 additions and 163 deletions

View File

@@ -41,6 +41,7 @@ import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
import com.android.settings.dashboard.RestrictedDashboardFragment; import com.android.settings.dashboard.RestrictedDashboardFragment;
@@ -308,8 +309,8 @@ public abstract class AccessibilityShortcutPreferenceFragment extends Restricted
final int shortcutTypes = getUserPreferredShortcutTypes(); final int shortcutTypes = getUserPreferredShortcutTypes();
mShortcutPreference.setChecked( mShortcutPreference.setChecked(
AccessibilityUtil.hasValuesInSettings(getPrefContext(), shortcutTypes, ShortcutUtils.isShortcutContained(
getComponentName())); getPrefContext(), shortcutTypes, getComponentName().flattenToString()));
mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
} }

View File

@@ -21,7 +21,6 @@ import static android.view.WindowInsets.Type.displayCutout;
import static android.view.WindowInsets.Type.systemBars; import static android.view.WindowInsets.Type.systemBars;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.DEFAULT;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS;
@@ -37,7 +36,6 @@ import android.graphics.Insets;
import android.graphics.Rect; import android.graphics.Rect;
import android.icu.text.CaseMap; import android.icu.text.CaseMap;
import android.os.Build; import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue; import android.util.TypedValue;
@@ -194,52 +192,6 @@ public final class AccessibilityUtil {
: AccessibilityServiceFragmentType.TOGGLE; : AccessibilityServiceFragmentType.TOGGLE;
} }
/**
* Returns if component name existed in one of {@code shortcutTypes} string in Settings.
*
* @param context The current context.
* @param shortcutTypes A combination of {@link UserShortcutType}.
* @param componentName The component name that need to be checked existed in Settings.
* @return {@code true} if componentName existed in Settings.
*/
static boolean hasValuesInSettings(Context context, int shortcutTypes,
@NonNull ComponentName componentName) {
for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) {
if (!android.provider.Flags.a11yStandaloneGestureEnabled()) {
if ((shortcutType & GESTURE) == GESTURE) {
continue;
}
}
if ((shortcutTypes & shortcutType) == shortcutType
&& hasValueInSettings(context, shortcutType, componentName)) {
return true;
}
}
return false;
}
/**
* Returns if component name existed in {@code shortcutType} string Settings.
*
* @param context The current context.
* @param shortcutType The preferred shortcut type user selected.
* @param componentName The component name that need to be checked existed in Settings.
* @return {@code true} if componentName existed in Settings.
*
* @deprecated use
* {@link ShortcutUtils#isShortcutContained(Context, int, String)} instead.
*
* (TODO 367414968: finish removal.)
*/
@Deprecated
@VisibleForTesting
static boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType,
@NonNull ComponentName componentName) {
return ShortcutUtils.getShortcutTargetsFromSettings(
context, shortcutType, UserHandle.myUserId()
).contains(componentName.flattenToString());
}
/** /**
* Gets the corresponding user shortcut type of a given accessibility service. * Gets the corresponding user shortcut type of a given accessibility service.
* *
@@ -250,14 +202,15 @@ public final class AccessibilityUtil {
*/ */
static int getUserShortcutTypesFromSettings(Context context, static int getUserShortcutTypesFromSettings(Context context,
@NonNull ComponentName componentName) { @NonNull ComponentName componentName) {
int shortcutTypes = DEFAULT; int shortcutTypes = UserShortcutType.DEFAULT;
for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) { for (int shortcutType : AccessibilityUtil.SHORTCUTS_ORDER_IN_UI) {
if (!android.provider.Flags.a11yStandaloneGestureEnabled()) { if (!android.provider.Flags.a11yStandaloneGestureEnabled()) {
if ((shortcutType & GESTURE) == GESTURE) { if ((shortcutType & GESTURE) == GESTURE) {
continue; continue;
} }
} }
if (hasValueInSettings(context, shortcutType, componentName)) { if (ShortcutUtils.isShortcutContained(
context, shortcutType, componentName.flattenToString())) {
shortcutTypes |= shortcutType; shortcutTypes |= shortcutType;
} }
} }

View File

@@ -56,6 +56,7 @@ import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
@@ -630,8 +631,8 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment
final int shortcutTypes = getUserPreferredShortcutTypes(); final int shortcutTypes = getUserPreferredShortcutTypes();
mShortcutPreference.setChecked( mShortcutPreference.setChecked(
AccessibilityUtil.hasValuesInSettings(getPrefContext(), shortcutTypes, ShortcutUtils.isShortcutContained(
mComponentName)); getPrefContext(), shortcutTypes, mComponentName.flattenToString()));
mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext())); mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
} }

View File

@@ -1,6 +1,7 @@
sdk=NEWEST_SDK sdk=NEWEST_SDK
shadows=\ shadows=\
com.android.settings.testutils.shadow.ShadowThreadUtils \ com.android.settings.testutils.shadow.ShadowThreadUtils \
com.android.settings.testutils.shadow.ShadowAccessibilityManager \
com.android.settings.network.ShadowServiceManagerExtend com.android.settings.network.ShadowServiceManagerExtend
instrumentedPackages=androidx.preference instrumentedPackages=androidx.preference
sqliteMode=native sqliteMode=native

View File

@@ -16,6 +16,8 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
@@ -564,9 +566,8 @@ public class AccessibilitySettingsTest {
} }
private void setShortcutEnabled(ComponentName componentName, boolean enabled) { private void setShortcutEnabled(ComponentName componentName, boolean enabled) {
Settings.Secure.putString(mContext.getContentResolver(), mShadowAccessibilityManager.setAccessibilityShortcutTargets(
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, SOFTWARE, (enabled) ? List.of(componentName.flattenToString()) : List.of());
enabled ? componentName.flattenToString() : "");
} }
private BooleanSubject assertUriObserversContainsClazz( private BooleanSubject assertUriObserversContainsClazz(

View File

@@ -40,6 +40,7 @@ import android.provider.Settings;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
import android.widget.PopupWindow; import android.widget.PopupWindow;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -52,6 +53,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings; import com.android.settings.SubSettings;
import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment; import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
import com.android.settings.testutils.shadow.ShadowAccessibilityManager;
import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowFragment;
import org.junit.Before; import org.junit.Before;
@@ -66,36 +68,31 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import java.util.List;
import java.util.Locale; import java.util.Locale;
/** Tests for {@link AccessibilityShortcutPreferenceFragment} */ /** Tests for {@link AccessibilityShortcutPreferenceFragment} */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = { @Config(shadows = com.android.settings.testutils.shadow.ShadowFragment.class)
com.android.settings.testutils.shadow.ShadowFragment.class,
})
public class AccessibilityShortcutPreferenceFragmentTest { public class AccessibilityShortcutPreferenceFragmentTest {
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
private static final String PLACEHOLDER_CLASS_NAME = PLACEHOLDER_PACKAGE_NAME + ".placeholder"; private static final String PLACEHOLDER_CLASS_NAME = PLACEHOLDER_PACKAGE_NAME + ".placeholder";
private static final String PLACEHOLDER_TILE_CLASS_NAME =
PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
private static final ComponentName PLACEHOLDER_COMPONENT_NAME = new ComponentName( private static final ComponentName PLACEHOLDER_COMPONENT_NAME = new ComponentName(
PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CLASS_NAME); PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CLASS_NAME);
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 TestAccessibilityShortcutPreferenceFragment mFragment; private TestAccessibilityShortcutPreferenceFragment mFragment;
private PreferenceScreen mScreen; private PreferenceScreen mScreen;
private Context mContext = ApplicationProvider.getApplicationContext(); private Context mContext = ApplicationProvider.getApplicationContext();
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager; private PreferenceManager mPreferenceManager;
private ShadowAccessibilityManager mShadowAccessibilityManager;
@Before @Before
public void setUpTestFragment() { public void setUpTestFragment() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mShadowAccessibilityManager = Shadow.extract(
mContext.getSystemService(AccessibilityManager.class));
mFragment = spy(new TestAccessibilityShortcutPreferenceFragment(null)); mFragment = spy(new TestAccessibilityShortcutPreferenceFragment(null));
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
@@ -118,8 +115,10 @@ public class AccessibilityShortcutPreferenceFragmentTest {
@Test @Test
public void updateShortcutPreferenceData_hasValueInSettings_assignToVariable() { public void updateShortcutPreferenceData_hasValueInSettings_assignToVariable() {
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString()); mShadowAccessibilityManager.setAccessibilityShortcutTargets(
putStringIntoSettings(HARDWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString()); SOFTWARE, List.of(PLACEHOLDER_COMPONENT_NAME.flattenToString()));
mShadowAccessibilityManager.setAccessibilityShortcutTargets(
HARDWARE, List.of(PLACEHOLDER_COMPONENT_NAME.flattenToString()));
mFragment.updateShortcutPreferenceData(); mFragment.updateShortcutPreferenceData();

View File

@@ -45,8 +45,6 @@ import android.provider.Settings;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.settings.R; import com.android.settings.R;
import org.junit.Before; import org.junit.Before;
@@ -57,7 +55,6 @@ import org.robolectric.RobolectricTestRunner;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.util.StringJoiner;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public final class AccessibilityUtilTest { public final class AccessibilityUtilTest {
@@ -67,16 +64,6 @@ public final class AccessibilityUtilTest {
private static final String MOCK_CLASS_NAME2 = MOCK_PACKAGE_NAME + ".mock_a11y_service2"; 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, private static final ComponentName MOCK_COMPONENT_NAME = new ComponentName(MOCK_PACKAGE_NAME,
MOCK_CLASS_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 QUICK_SETTINGS_SHORTCUT_KEY =
Settings.Secure.ACCESSIBILITY_QS_TARGETS;
private static final String PLACEHOLDER_SETTING_FEATURE = "placeholderSettingFeature";
@Rule @Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -161,56 +148,6 @@ public final class AccessibilityUtilTest {
AccessibilityUtil.AccessibilityServiceFragmentType.TOGGLE); AccessibilityUtil.AccessibilityServiceFragmentType.TOGGLE);
} }
@Test
public void hasValueInSettings_putValue_hasValue() {
setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
assertThat(AccessibilityUtil.hasValueInSettings(mContext, SOFTWARE,
MOCK_COMPONENT_NAME)).isTrue();
}
@Test
public void getUserShortcutTypeFromSettings_putOneValue_hasValue() {
setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
MOCK_COMPONENT_NAME);
assertThat(shortcutTypes).isEqualTo(
SOFTWARE
);
}
@Test
public void getUserShortcutTypeFromSettings_putTwoValues_hasValue() {
setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
setShortcut(HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
MOCK_COMPONENT_NAME);
assertThat(shortcutTypes).isEqualTo(
SOFTWARE
| HARDWARE
);
}
@Test
public void getUserShortcutTypeFromSettings_threeShortcutTypesChosen() {
setShortcut(SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
setShortcut(HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
setShortcut(QUICK_SETTINGS, MOCK_COMPONENT_NAME.flattenToString());
final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
MOCK_COMPONENT_NAME);
assertThat(shortcutTypes).isEqualTo(
SOFTWARE
| HARDWARE
| QUICK_SETTINGS
);
}
@Test @Test
public void convertKeyFromSettings_shortcutTypeSoftware() { public void convertKeyFromSettings_shortcutTypeSoftware() {
assertThat(AccessibilityUtil.convertKeyFromSettings(SOFTWARE)) assertThat(AccessibilityUtil.convertKeyFromSettings(SOFTWARE))
@@ -308,28 +245,9 @@ public final class AccessibilityUtilTest {
return null; return null;
} }
private String getStringFromSettings(String key) {
return Settings.Secure.getString(mContext.getContentResolver(), key);
}
private void setSettingsFeatureEnabled(String settingsKey, boolean enabled) { private void setSettingsFeatureEnabled(String settingsKey, boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putInt(mContext.getContentResolver(),
settingsKey, settingsKey,
enabled ? AccessibilityUtil.State.ON : AccessibilityUtil.State.OFF); 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(),
ShortcutUtils.convertToKey(shortcutType), shortcutComponents.toString());
}
private void clearShortcuts() {
Settings.Secure.putString(mContext.getContentResolver(), SOFTWARE_SHORTCUT_KEY, "");
Settings.Secure.putString(mContext.getContentResolver(), HARDWARE_SHORTCUT_KEY, "");
Settings.Secure.putString(mContext.getContentResolver(), QUICK_SETTINGS_SHORTCUT_KEY, "");
}
} }

View File

@@ -193,7 +193,6 @@ public class ToggleDaltonizerPreferenceFragmentTest {
} }
private ToggleDaltonizerPreferenceFragment getFragmentInResumedState() { private ToggleDaltonizerPreferenceFragment getFragmentInResumedState() {
mActivityController.create().start().resume(); mActivityController.create().start().resume();
Fragment fragment = mActivityController.get().getSupportFragmentManager().findFragmentById( Fragment fragment = mActivityController.get().getSupportFragmentManager().findFragmentById(
R.id.main_content); R.id.main_content);

View File

@@ -43,6 +43,7 @@ import android.provider.Settings;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
import android.widget.PopupWindow; import android.widget.PopupWindow;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
@@ -54,6 +55,7 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
import com.android.settings.flags.Flags; import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAccessibilityManager;
import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settingslib.widget.TopIntroPreference; import com.android.settingslib.widget.TopIntroPreference;
@@ -72,12 +74,14 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import java.util.List;
import java.util.Locale; import java.util.Locale;
/** Tests for {@link ToggleFeaturePreferenceFragment} */ /** Tests for {@link ToggleFeaturePreferenceFragment} */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = { @Config(shadows = {
ShadowFragment.class, ShadowFragment.class,
ShadowAccessibilityManager.class
}) })
public class ToggleFeaturePreferenceFragmentTest { public class ToggleFeaturePreferenceFragmentTest {
@Rule @Rule
@@ -109,6 +113,7 @@ public class ToggleFeaturePreferenceFragmentTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager; private PreferenceManager mPreferenceManager;
private ShadowAccessibilityManager mShadowAccessibilityManager;
@Mock @Mock
private FragmentActivity mActivity; private FragmentActivity mActivity;
@@ -120,6 +125,8 @@ public class ToggleFeaturePreferenceFragmentTest {
@Before @Before
public void setUpTestFragment() { public void setUpTestFragment() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mShadowAccessibilityManager = Shadow.extract(
mContext.getSystemService(AccessibilityManager.class));
mFragment = spy(new TestToggleFeaturePreferenceFragment()); mFragment = spy(new TestToggleFeaturePreferenceFragment());
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
@@ -178,10 +185,10 @@ public class ToggleFeaturePreferenceFragmentTest {
@Test @Test
public void updateShortcutPreferenceData_hasValueInSettings_assignToVariable() { public void updateShortcutPreferenceData_hasValueInSettings_assignToVariable() {
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME; mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
putSecureStringIntoSettings(SOFTWARE_SHORTCUT_KEY, mShadowAccessibilityManager.setAccessibilityShortcutTargets(
PLACEHOLDER_COMPONENT_NAME.flattenToString()); SOFTWARE, List.of(PLACEHOLDER_COMPONENT_NAME.flattenToString()));
putSecureStringIntoSettings(HARDWARE_SHORTCUT_KEY, mShadowAccessibilityManager.setAccessibilityShortcutTargets(
PLACEHOLDER_COMPONENT_NAME.flattenToString()); HARDWARE, List.of(PLACEHOLDER_COMPONENT_NAME.flattenToString()));
mFragment.updateShortcutPreferenceData(); mFragment.updateShortcutPreferenceData();
@@ -339,10 +346,6 @@ public class ToggleFeaturePreferenceFragmentTest {
assertThat(summary).isEqualTo(expected); assertThat(summary).isEqualTo(expected);
} }
private void putSecureStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
}
private String getSecureStringFromSettings(String key) { private String getSecureStringFromSettings(String key) {
return Settings.Secure.getString(mContext.getContentResolver(), key); return Settings.Secure.getString(mContext.getContentResolver(), key);
} }

View File

@@ -16,6 +16,8 @@
package com.android.settings.testutils.shadow; package com.android.settings.testutils.shadow;
import static com.google.common.truth.Truth.assertThat;
import android.accessibilityservice.AccessibilityShortcutInfo; import android.accessibilityservice.AccessibilityShortcutInfo;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
@@ -24,11 +26,12 @@ import android.content.Context;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -39,6 +42,7 @@ import java.util.Map;
public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAccessibilityManager { public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAccessibilityManager {
private Map<ComponentName, ComponentName> mA11yFeatureToTileMap = new ArrayMap<>(); private Map<ComponentName, ComponentName> mA11yFeatureToTileMap = new ArrayMap<>();
private List<AccessibilityShortcutInfo> mInstalledAccessibilityShortcutList = List.of(); private List<AccessibilityShortcutInfo> mInstalledAccessibilityShortcutList = List.of();
private Map<Integer, List<String>> mShortcutTargets = new ArrayMap<>();
/** /**
* Implements a hidden method {@link AccessibilityManager#getA11yFeatureToTileMap} * Implements a hidden method {@link AccessibilityManager#getA11yFeatureToTileMap}
@@ -80,7 +84,20 @@ public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAc
*/ */
@Implementation @Implementation
public List<String> getAccessibilityShortcutTargets( public List<String> getAccessibilityShortcutTargets(
@ShortcutConstants.UserShortcutType int shortcutType) { @UserShortcutType int shortcutType) {
return List.of(); if (!mShortcutTargets.containsKey(shortcutType)) {
mShortcutTargets.put(shortcutType, new ArrayList<>());
}
List<String> targets = mShortcutTargets.get(shortcutType);
assertThat(targets).isNotNull();
return targets;
}
/**
* Used by tests to easily write directly to a shortcut targets value
*/
public void setAccessibilityShortcutTargets(
@UserShortcutType int shortcutType, List<String> targets) {
mShortcutTargets.put(shortcutType, targets);
} }
} }