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
diff --git a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
index d04b34a..f05b157 100644
--- a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
@@ -61,6 +61,7 @@
 import com.android.settings.R;
 import com.android.settings.SetupWizardUtils;
 import com.android.settings.accessibility.AccessibilitySetupWizardUtils;
+import com.android.settings.accessibility.Flags;
 import com.android.settings.accessibility.PreferredShortcuts;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
@@ -201,9 +202,14 @@
         super.onCreatePreferences(savedInstanceState, rootKey);
 
         Activity activity = getActivity();
+        final Preference descriptionPref = findPreference(getString(
+                R.string.accessibility_shortcut_description_pref));
 
         if (!activity.getIntent().getAction().equals(
                 Settings.ACTION_ACCESSIBILITY_SHORTCUT_SETTINGS)) {
+            if (Flags.toggleFeatureFragmentCollectionInfo()) {
+                descriptionPref.setVisible(false);
+            }
             return;
         }
 
@@ -219,10 +225,11 @@
         );
 
         activity.setTitle(titles.first);
-
-        String screenDescriptionPrefKey = getString(
-                R.string.accessibility_shortcut_description_pref);
-        findPreference(screenDescriptionPrefKey).setSummary(titles.second);
+        if (titles.second != null || !Flags.toggleFeatureFragmentCollectionInfo()) {
+            descriptionPref.setSummary(titles.second);
+        } else {
+            descriptionPref.setVisible(false);
+        }
     }
 
     @NonNull
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
index 414fe63..b3270e9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
@@ -16,6 +16,9 @@
 
 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_CONTROLLER_NAME;
 import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
@@ -45,6 +48,7 @@
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.Flags;
 
+import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.testing.FragmentScenario;
 import androidx.lifecycle.Lifecycle;
@@ -160,7 +164,7 @@
     public void showEditShortcutScreen_inSuw_launchSubSettingWithSuw() {
         EditShortcutsPreferenceFragment.showEditShortcutScreen(
                 mActivity, METRICS_CATEGORY, SCREEN_TITLE,
-                TARGET_FAKE_COMPONENT, createSuwIntent(new Intent(), /* isInSuw= */ true));
+                TARGET_FAKE_COMPONENT, setIntentInSuw(new Intent(), /* isInSuw= */ true));
 
         assertLaunchSubSettingWithCurrentTargetComponents(
                 TARGET_FAKE_COMPONENT.flattenToString(), /* isInSuw= */ true);
@@ -199,6 +203,53 @@
     }
 
     @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
     public void fragmentCreated_settingsObserversAreRegistered() {
         ShadowContentResolver contentResolver = shadowOf(mContext.getContentResolver());
         for (Uri uri : SHORTCUT_SETTINGS) {
@@ -654,9 +705,14 @@
 
     private FragmentScenario<EditShortcutsPreferenceFragment> createFragScenario(
             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();
         args.putStringArray(
-                EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS, new String[]{target});
+                EditShortcutsPreferenceFragment.ARG_KEY_SHORTCUT_TARGETS,
+                targets.toArray(new String[0]));
         FragmentScenario<EditShortcutsPreferenceFragment> scenario =
                 FragmentScenario.launch(
                         EditShortcutsPreferenceFragment.class, args,
@@ -664,7 +720,11 @@
         scenario.onFragment(fragment -> {
             Intent intent = fragment.requireActivity().getIntent();
             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
             // to modify the activity's intent; initialize controllers again
             fragment.initializePreferenceControllerArguments();
@@ -672,11 +732,7 @@
         return scenario;
     }
 
-    private Intent createSuwIntent(Intent intent, boolean isInSuw) {
-
-        if (intent == null) {
-            intent = new Intent();
-        }
+    private Intent setIntentInSuw(Intent intent, boolean isInSuw) {
         intent.putExtra(EXTRA_IS_SETUP_FLOW, isInSuw);
         intent.putExtra(EXTRA_IS_FIRST_RUN, isInSuw);
         intent.putExtra(EXTRA_IS_PRE_DEFERRED_SETUP, isInSuw);
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
index fcd1e42..7de69a7 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
@@ -24,6 +24,8 @@
 import android.util.ArrayMap;
 import android.view.accessibility.AccessibilityManager;
 
+import com.android.internal.accessibility.common.ShortcutConstants;
+
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
@@ -71,4 +73,14 @@
             @NonNull List<AccessibilityShortcutInfo> installedAccessibilityShortcutList) {
         mInstalledAccessibilityShortcutList = installedAccessibilityShortcutList;
     }
+
+    /**
+     * Implements the hidden method
+     * {@link AccessibilityManager#getAccessibilityShortcutTargets}.
+     */
+    @Implementation
+    public List<String> getAccessibilityShortcutTargets(
+            @ShortcutConstants.UserShortcutType int shortcutType) {
+        return List.of();
+    }
 }