[RWS - Clank] Update RWS group display post-deletion

1. For RWS rows in the RWS section, remove them from the screen if
   deleted and remove the RWS preferences if necessary
2. For the RWS group, navigate back to the previous page if all data is
   deleted

Further details: go/site-settings-delete-data-1p

Bug: b:404576036
Change-Id: I4af12bddf0f162aea8dcc0db9bf3e0c32ee09860
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6373388
Reviewed-by: Fiona Macintosh <fmacintosh@google.com>
Reviewed-by: Christian Dullweber <dullweber@chromium.org>
Commit-Queue: Maggie Jennings <mjenn@google.com>
Cr-Commit-Position: refs/heads/main@{#1436881}
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
index 3d057f27..1569ee9 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
@@ -45,6 +45,7 @@
     // Preference keys, see grouped_websites_preferences.xml.
     public static final String PREF_SITE_TITLE = "site_title";
     public static final String PREF_CLEAR_DATA = "clear_data";
+    public static final String PREF_USAGE = "site_usage";
     public static final String PREF_RELATED_SITES = "related_sites";
     public static final String PREF_RELATED_SITES_CLEAR_DATA = "related_sites_delete_data_button";
     public static final String PREF_SITES_IN_GROUP = "sites_in_group";
@@ -353,6 +354,17 @@
                                     getSiteSettingsDelegate(),
                                     entry,
                                     getActivity().getLayoutInflater());
+                    // Remove preference upon single site deletion
+                    preference.setOnDeleteCallback(
+                            () -> {
+                                relatedSitesHeader.removePreference(preference);
+                                // Remove RWS section if only remaining preference is the
+                                // description
+                                if (relatedSitesHeader.getPreferenceCount() == 1) {
+                                    removePreferenceSafely(PREF_RELATED_SITES);
+                                    removePreferenceSafely(PREF_RELATED_SITES_CLEAR_DATA);
+                                }
+                            });
                     relatedSitesHeader.addPreference(preference);
                 }
                 relatedSitesClearDataButton.setOnPreferenceClickListener(
@@ -394,4 +406,13 @@
             category.addPreference(preference);
         }
     }
+
+    /**
+     * Ensures preference exists before removing to avoid NPE in {@link
+     * PreferenceScreen#removePreference}.
+     */
+    private void removePreferenceSafely(CharSequence prefKey) {
+        Preference preference = findPreference(prefKey);
+        if (preference != null) getPreferenceScreen().removePreference(preference);
+    }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
index 6539881..eabeb81 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java
@@ -282,12 +282,21 @@
                 popBackIfNoSettings();
             };
 
+    private final Runnable mRwsDataClearedCallback =
+            () -> {
+                Activity activity = getActivity();
+                if (activity == null || activity.isFinishing()) {
+                    return;
+                }
+                popBackToPreviousPage();
+            };
+
     /**
-     * Creates a Bundle with the correct arguments for opening this fragment for
-     * the website with the given url.
+     * Creates a Bundle with the correct arguments for opening this fragment for the website with
+     * the given url.
      *
      * @param url The URL to open the fragment with. This is a complete url including scheme,
-     *            domain, port,  path, etc.
+     *     domain, port, path, etc.
      * @return The bundle to attach to the preferences intent.
      */
     public static Bundle createFragmentArgsForSite(String url) {
@@ -1004,7 +1013,7 @@
         RwsCookieInfo rwsInfo = assumeNonNull(mSite).getRwsCookieInfo();
         assumeNonNull(rwsInfo);
         WebsiteGroup group = new WebsiteGroup(rwsInfo.getOwner(), rwsInfo.getMembers());
-        SiteDataCleaner.clearData(getSiteSettingsDelegate(), group, mDataClearedCallback);
+        SiteDataCleaner.clearData(getSiteSettingsDelegate(), group, mRwsDataClearedCallback);
         RecordHistogram.recordEnumeratedHistogram(
                 "Privacy.DeleteBrowsingData.Action",
                 DeleteBrowsingDataAction.RWS_DELETE_ALL_DATA,
@@ -1094,6 +1103,16 @@
                                     getSiteSettingsDelegate(),
                                     entry,
                                     getActivity().getLayoutInflater());
+                    preference.setOnDeleteCallback(
+                            () -> {
+                                relatedSitesHeader.removePreference(preference);
+                                // Remove RWS section if only remaining preference is the
+                                // description
+                                if (relatedSitesHeader.getPreferenceCount() == 1) {
+                                    removePreferenceSafely(PREF_RELATED_SITES_HEADER);
+                                    removePreferenceSafely(PREF_RELATED_SITES_CLEAR_DATA);
+                                }
+                            });
                     relatedSitesHeader.addPreference(preference);
                 }
                 relatedSitesClearDataButton.setOnPreferenceClickListener(
@@ -1442,17 +1461,21 @@
 
     private void popBackIfNoSettings() {
         if (!hasPermissionsPreferences() && !hasUsagePreferences() && getActivity() != null) {
-            // Save the paused fragment before finishing the current fragment as it may cause the
-            // paused fragment to resume.
-            GroupedWebsitesSettings groupFragment = GroupedWebsitesSettings.getPausedInstance();
-            Activity activity = getActivity();
-            if (activity != null) {
-                var settingsNavigation = assumeNonNull(getSettingsNavigation());
-                settingsNavigation.finishCurrentSettings(this);
-                if (mFromGrouped && groupFragment != null) {
-                    settingsNavigation.executePendingNavigations(activity);
-                    settingsNavigation.finishCurrentSettings(groupFragment);
-                }
+            popBackToPreviousPage();
+        }
+    }
+
+    private void popBackToPreviousPage() {
+        // Save the paused fragment before finishing the current fragment as it may cause the
+        // paused fragment to resume.
+        GroupedWebsitesSettings groupFragment = GroupedWebsitesSettings.getPausedInstance();
+        Activity activity = getActivity();
+        if (activity != null) {
+            var settingsNavigation = assumeNonNull(getSettingsNavigation());
+            settingsNavigation.finishCurrentSettings(this);
+            if (mFromGrouped && groupFragment != null) {
+                settingsNavigation.executePendingNavigations(activity);
+                settingsNavigation.finishCurrentSettings(groupFragment);
             }
         }
     }