Merge "Fix TalkBack shortcut keeps showing enabled when entering into that page."
This commit is contained in:
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user