Merge "Fix TalkBack shortcut keeps showing enabled when entering into that page."

This commit is contained in:
Jason Hsu
2022-11-10 15:34:28 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 33 deletions

View File

@@ -34,7 +34,6 @@ import android.icu.text.CaseMap;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.service.quicksettings.TileService; import android.service.quicksettings.TileService;
import android.text.Html; import android.text.Html;
@@ -62,7 +61,6 @@ import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.utils.LocaleUtils; import com.android.settings.utils.LocaleUtils;
import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchBar;
import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settings.widget.SettingsMainSwitchPreference;
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.widget.IllustrationPreference; import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.OnMainSwitchChangeListener; import com.android.settingslib.widget.OnMainSwitchChangeListener;
import com.android.settingslib.widget.TopIntroPreference; import com.android.settingslib.widget.TopIntroPreference;
@@ -255,7 +253,7 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment
}); });
} }
writeDefaultShortcutTargetServiceToSettingsIfNeeded(getPrefContext()); writeConfigDefaultAccessibilityServiceIntoShortcutTargetServiceIfNeeded(getContext());
} }
@Override @Override
@@ -796,44 +794,36 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment
} }
/** /**
* Setups a configurable default if the setting has never been set. * Setups {@link com.android.internal.R.string#config_defaultAccessibilityService} into
* * {@link Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE} if that settings key has never
* TODO(b/228562075): Remove this function when correcting the format in config file * been set and only write the key when user enter into corresponding page.
* `config_defaultAccessibilityService`.
*/ */
private void writeDefaultShortcutTargetServiceToSettingsIfNeeded(Context context) { @VisibleForTesting
void writeConfigDefaultAccessibilityServiceIntoShortcutTargetServiceIfNeeded(Context context) {
if (mComponentName == null) { if (mComponentName == null) {
return; return;
} }
final ComponentName defaultService = ComponentName.unflattenFromString(context.getString( // It might be shortened form (with a leading '.'). Need to unflatten back to ComponentName
com.android.internal.R.string.config_defaultAccessibilityService)); // first, or it will encounter errors when getting service from
// write default accessibility service only when user enter into corresponding page. // `ACCESSIBILITY_SHORTCUT_TARGET_SERVICE`.
if (!mComponentName.equals(defaultService)) { final ComponentName configDefaultService = ComponentName.unflattenFromString(
getString(com.android.internal.R.string.config_defaultAccessibilityService));
if (!mComponentName.equals(configDefaultService)) {
return; return;
} }
final String targetKey = Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE; final String targetKey = Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
String targetString = Settings.Secure.getString(context.getContentResolver(), targetKey); final String targetString = Settings.Secure.getString(context.getContentResolver(),
if (!TextUtils.isEmpty(targetString)) { targetKey);
// The shortcut setting has been set
return;
}
// AccessibilityManager#getAccessibilityShortcutTargets may not return correct shortcut // By intentional, we only need to write the config string when the Settings key has never
// targets during boot. Needs to read settings directly here. // been set (== null). Empty string also means someone already wrote it before, so we need
targetString = AccessibilityUtils.getShortcutTargetServiceComponentNameString(context, // to respect the value.
UserHandle.myUserId()); if (targetString == null) {
if (TextUtils.isEmpty(targetString)) {
// No configurable default accessibility service
return;
}
// Only fallback to default accessibility service when setting is never updated.
final ComponentName shortcutName = ComponentName.unflattenFromString(targetString);
if (shortcutName != null) {
Settings.Secure.putString(context.getContentResolver(), targetKey, Settings.Secure.putString(context.getContentResolver(), targetKey,
shortcutName.flattenToString()); configDefaultService.flattenToString());
} }
} }

View File

@@ -60,6 +60,7 @@ import org.junit.runner.RunWith;
import org.mockito.Answers; import org.mockito.Answers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
@@ -91,6 +92,7 @@ public class ToggleFeaturePreferenceFragmentTest {
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE; Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
private TestToggleFeaturePreferenceFragment mFragment; private TestToggleFeaturePreferenceFragment mFragment;
@Spy
private final Context mContext = ApplicationProvider.getApplicationContext(); private final Context mContext = ApplicationProvider.getApplicationContext();
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -160,8 +162,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;
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString()); putSecureStringIntoSettings(SOFTWARE_SHORTCUT_KEY,
putStringIntoSettings(HARDWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString()); PLACEHOLDER_COMPONENT_NAME.flattenToString());
putSecureStringIntoSettings(HARDWARE_SHORTCUT_KEY,
PLACEHOLDER_COMPONENT_NAME.flattenToString());
mFragment.updateShortcutPreferenceData(); mFragment.updateShortcutPreferenceData();
@@ -327,10 +331,28 @@ public class ToggleFeaturePreferenceFragmentTest {
assertThat(accessibilityFooterPreference.getOrder()).isEqualTo(Integer.MAX_VALUE - 1); assertThat(accessibilityFooterPreference.getOrder()).isEqualTo(Integer.MAX_VALUE - 1);
} }
private void putStringIntoSettings(String key, String componentName) { @Test
@Config(shadows = ShadowFragment.class)
public void writeConfigDefaultIfNeeded_sameCNWithFragAndConfig_SameValueInVolumeSettingsKey() {
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
doReturn(PLACEHOLDER_COMPONENT_NAME.flattenToString()).when(mFragment).getString(
com.android.internal.R.string.config_defaultAccessibilityService);
mFragment.writeConfigDefaultAccessibilityServiceIntoShortcutTargetServiceIfNeeded(mContext);
assertThat(
getSecureStringFromSettings(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE))
.isEqualTo(PLACEHOLDER_COMPONENT_NAME.flattenToString());
}
private void putSecureStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName); Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
} }
private String getSecureStringFromSettings(String key) {
return Settings.Secure.getString(mContext.getContentResolver(), key);
}
private void putUserShortcutTypeIntoSharedPreference(Context context, private void putUserShortcutTypeIntoSharedPreference(Context context,
PreferredShortcut shortcut) { PreferredShortcut shortcut) {
PreferredShortcuts.saveUserShortcutType(context, shortcut); PreferredShortcuts.saveUserShortcutType(context, shortcut);