Hides the Edit Shortcut top preference when empty.
This fixes an issue where this page was presenting an inaccurate preference list count to TalkBack because it was including this empty preference. (Uses the same flag as other fixes for this same bug, even though the flag name doesn't make sense here.) Test: atest EditShortcutsPreferenceFragmentTest Test: Confirm preference invisible when editing a single feature, opened from the Settings app Test: Confirm preference invisible when editing a single feature, opened from the FAB Drag-to-Edit Test: Confirm preference still visible when editing multiple features, opened from the FAB Drag-to-Edit Test: Confirm TalkBack announces correct item counts in both cases, including when editing Magnification which has an "advanced" preference that gets replaced with the triple-tap shortcut. Bug: 318607873 Flag: com.android.settings.accessibility.toggle_feature_fragment_collection_info Change-Id: I2e1eb7f66022c1a47d1f96a914294fd8da25549c
This commit is contained in:
@@ -61,6 +61,7 @@ import com.android.internal.accessibility.dialog.AccessibilityTargetHelper;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SetupWizardUtils;
|
import com.android.settings.SetupWizardUtils;
|
||||||
import com.android.settings.accessibility.AccessibilitySetupWizardUtils;
|
import com.android.settings.accessibility.AccessibilitySetupWizardUtils;
|
||||||
|
import com.android.settings.accessibility.Flags;
|
||||||
import com.android.settings.accessibility.PreferredShortcuts;
|
import com.android.settings.accessibility.PreferredShortcuts;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
@@ -201,9 +202,14 @@ public class EditShortcutsPreferenceFragment extends DashboardFragment {
|
|||||||
super.onCreatePreferences(savedInstanceState, rootKey);
|
super.onCreatePreferences(savedInstanceState, rootKey);
|
||||||
|
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
|
final Preference descriptionPref = findPreference(getString(
|
||||||
|
R.string.accessibility_shortcut_description_pref));
|
||||||
|
|
||||||
if (!activity.getIntent().getAction().equals(
|
if (!activity.getIntent().getAction().equals(
|
||||||
Settings.ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS)) {
|
Settings.ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS)) {
|
||||||
|
if (Flags.toggleFeatureFragmentCollectionInfo()) {
|
||||||
|
descriptionPref.setVisible(false);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,10 +225,11 @@ public class EditShortcutsPreferenceFragment extends DashboardFragment {
|
|||||||
);
|
);
|
||||||
|
|
||||||
activity.setTitle(titles.first);
|
activity.setTitle(titles.first);
|
||||||
|
if (titles.second != null || !Flags.toggleFeatureFragmentCollectionInfo()) {
|
||||||
String screenDescriptionPrefKey = getString(
|
descriptionPref.setSummary(titles.second);
|
||||||
R.string.accessibility_shortcut_description_pref);
|
} else {
|
||||||
findPreference(screenDescriptionPrefKey).setSummary(titles.second);
|
descriptionPref.setVisible(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
@@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package com.android.settings.accessibility.shortcuts;
|
package com.android.settings.accessibility.shortcuts;
|
||||||
|
|
||||||
|
import static android.provider.Settings.ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS;
|
||||||
|
|
||||||
|
import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
|
||||||
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
|
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
|
||||||
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
|
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
|
||||||
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
|
import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
|
||||||
@@ -45,6 +48,7 @@ import android.util.Pair;
|
|||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
import android.view.accessibility.Flags;
|
import android.view.accessibility.Flags;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.fragment.app.testing.FragmentScenario;
|
import androidx.fragment.app.testing.FragmentScenario;
|
||||||
import androidx.lifecycle.Lifecycle;
|
import androidx.lifecycle.Lifecycle;
|
||||||
@@ -160,7 +164,7 @@ public class EditShortcutsPreferenceFragmentTest {
|
|||||||
public void showEditShortcutScreen_inSuw_launchSubSettingWithSuw() {
|
public void showEditShortcutScreen_inSuw_launchSubSettingWithSuw() {
|
||||||
EditShortcutsPreferenceFragment.showEditShortcutScreen(
|
EditShortcutsPreferenceFragment.showEditShortcutScreen(
|
||||||
mActivity, METRICS_CATEGORY, SCREEN_TITLE,
|
mActivity, METRICS_CATEGORY, SCREEN_TITLE,
|
||||||
TARGET_FAKE_COMPONENT, createSuwIntent(new Intent(), /* isInSuw= */ true));
|
TARGET_FAKE_COMPONENT, setIntentInSuw(new Intent(), /* isInSuw= */ true));
|
||||||
|
|
||||||
assertLaunchSubSettingWithCurrentTargetComponents(
|
assertLaunchSubSettingWithCurrentTargetComponents(
|
||||||
TARGET_FAKE_COMPONENT.flattenToString(), /* isInSuw= */ true);
|
TARGET_FAKE_COMPONENT.flattenToString(), /* isInSuw= */ true);
|
||||||
@@ -198,6 +202,53 @@ public class EditShortcutsPreferenceFragmentTest {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnableFlags(
|
||||||
|
com.android.settings.accessibility.Flags.FLAG_TOGGLE_FEATURE_FRAGMENT_COLLECTION_INFO)
|
||||||
|
public void shortcutDescriptionPref_defaultLaunch_notVisible() {
|
||||||
|
mFragmentScenario = createFragScenario(/* isInSuw= */ false, TARGET);
|
||||||
|
mFragmentScenario.moveToState(Lifecycle.State.CREATED);
|
||||||
|
|
||||||
|
mFragmentScenario.onFragment(fragment -> {
|
||||||
|
Preference preference = fragment.findPreference(
|
||||||
|
mContext.getString(R.string.accessibility_shortcut_description_pref));
|
||||||
|
assertThat(preference.isVisible()).isFalse();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnableFlags(
|
||||||
|
com.android.settings.accessibility.Flags.FLAG_TOGGLE_FEATURE_FRAGMENT_COLLECTION_INFO)
|
||||||
|
public void shortcutDescriptionPref_launchFromAction_singleTarget_notVisible() {
|
||||||
|
mFragmentScenario = createFragScenario(/* isInSuw= */ false, List.of(TARGET),
|
||||||
|
ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS);
|
||||||
|
mFragmentScenario.moveToState(Lifecycle.State.CREATED);
|
||||||
|
|
||||||
|
mFragmentScenario.onFragment(fragment -> {
|
||||||
|
Preference preference = fragment.findPreference(
|
||||||
|
mContext.getString(R.string.accessibility_shortcut_description_pref));
|
||||||
|
assertThat(preference.isVisible()).isFalse();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@EnableFlags(
|
||||||
|
com.android.settings.accessibility.Flags.FLAG_TOGGLE_FEATURE_FRAGMENT_COLLECTION_INFO)
|
||||||
|
public void shortcutDescriptionPref_launchFromAction_multipleTargets_isVisible() {
|
||||||
|
mFragmentScenario = createFragScenario(/* isInSuw= */ false,
|
||||||
|
// Both of these components are system components with known labels, so we don't
|
||||||
|
// need to mock AccessibilityManager with fake labels.
|
||||||
|
List.of(TARGET, DALTONIZER_COMPONENT_NAME.flattenToString()),
|
||||||
|
ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS);
|
||||||
|
mFragmentScenario.moveToState(Lifecycle.State.CREATED);
|
||||||
|
|
||||||
|
mFragmentScenario.onFragment(fragment -> {
|
||||||
|
Preference preference = fragment.findPreference(
|
||||||
|
mContext.getString(R.string.accessibility_shortcut_description_pref));
|
||||||
|
assertThat(preference.isVisible()).isTrue();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void fragmentCreated_settingsObserversAreRegistered() {
|
public void fragmentCreated_settingsObserversAreRegistered() {
|
||||||
ShadowContentResolver contentResolver = shadowOf(mContext.getContentResolver());
|
ShadowContentResolver contentResolver = shadowOf(mContext.getContentResolver());
|
||||||
@@ -654,9 +705,14 @@ public class EditShortcutsPreferenceFragmentTest {
|
|||||||
|
|
||||||
private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(
|
private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(
|
||||||
boolean isInSuw, String target) {
|
boolean isInSuw, String target) {
|
||||||
|
return createFragScenario(isInSuw, List.of(target), null);
|
||||||
|
}
|
||||||
|
private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(
|
||||||
|
boolean isInSuw, List<String> targets, @Nullable String intentAction) {
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putStringArray(
|
args.putStringArray(
|
||||||
EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS, new String[]{target});
|
EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS,
|
||||||
|
targets.toArray(new String[0]));
|
||||||
FragmentScenario<EditShortcutsPreferenceFragment> scenario =
|
FragmentScenario<EditShortcutsPreferenceFragment> scenario =
|
||||||
FragmentScenario.launch(
|
FragmentScenario.launch(
|
||||||
EditShortcutsPreferenceFragment.class, args,
|
EditShortcutsPreferenceFragment.class, args,
|
||||||
@@ -664,7 +720,11 @@ public class EditShortcutsPreferenceFragmentTest {
|
|||||||
scenario.onFragment(fragment -> {
|
scenario.onFragment(fragment -> {
|
||||||
Intent intent = fragment.requireActivity().getIntent();
|
Intent intent = fragment.requireActivity().getIntent();
|
||||||
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, SCREEN_TITLE);
|
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, SCREEN_TITLE);
|
||||||
fragment.requireActivity().setIntent(createSuwIntent(intent, isInSuw));
|
setIntentInSuw(intent, isInSuw);
|
||||||
|
if (intentAction != null) {
|
||||||
|
intent.setAction(intentAction);
|
||||||
|
}
|
||||||
|
fragment.requireActivity().setIntent(intent);
|
||||||
// Since the fragment is attached before we have a chance
|
// Since the fragment is attached before we have a chance
|
||||||
// to modify the activity's intent; initialize controllers again
|
// to modify the activity's intent; initialize controllers again
|
||||||
fragment.initializePreferenceControllerArguments();
|
fragment.initializePreferenceControllerArguments();
|
||||||
@@ -672,11 +732,7 @@ public class EditShortcutsPreferenceFragmentTest {
|
|||||||
return scenario;
|
return scenario;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent createSuwIntent(Intent intent, boolean isInSuw) {
|
private Intent setIntentInSuw(Intent intent, boolean isInSuw) {
|
||||||
|
|
||||||
if (intent == null) {
|
|
||||||
intent = new Intent();
|
|
||||||
}
|
|
||||||
intent.putExtra(EXTRA_IS_SETUP_FLOW, isInSuw);
|
intent.putExtra(EXTRA_IS_SETUP_FLOW, isInSuw);
|
||||||
intent.putExtra(EXTRA_IS_FIRST_RUN, isInSuw);
|
intent.putExtra(EXTRA_IS_FIRST_RUN, isInSuw);
|
||||||
intent.putExtra(EXTRA_IS_PRE_DEFERRED_SETUP, isInSuw);
|
intent.putExtra(EXTRA_IS_PRE_DEFERRED_SETUP, isInSuw);
|
||||||
|
@@ -24,6 +24,8 @@ 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 org.robolectric.annotation.Implementation;
|
import org.robolectric.annotation.Implementation;
|
||||||
import org.robolectric.annotation.Implements;
|
import org.robolectric.annotation.Implements;
|
||||||
|
|
||||||
@@ -71,4 +73,14 @@ public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAc
|
|||||||
@NonNull List<AccessibilityShortcutInfo> installedAccessibilityShortcutList) {
|
@NonNull List<AccessibilityShortcutInfo> installedAccessibilityShortcutList) {
|
||||||
mInstalledAccessibilityShortcutList = installedAccessibilityShortcutList;
|
mInstalledAccessibilityShortcutList = installedAccessibilityShortcutList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the hidden method
|
||||||
|
* {@link AccessibilityManager#getAccessibilityShortcutTargets}.
|
||||||
|
*/
|
||||||
|
@Implementation
|
||||||
|
public List<String> getAccessibilityShortcutTargets(
|
||||||
|
@ShortcutConstants.UserShortcutType int shortcutType) {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user