[STGV2] Add profile preferences for the "Dont Ask Again" checkbox.

For all versions of the GroupDeletionDialog, provide a non synced pref
that prevents the dialog from showing if the user has already accepted
it.

Bug: 325289297
Change-Id: I451612c59233a02fcafe6ffc0df9203f87878313
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5474171
Reviewed-by: Darryl James <[email protected]>
Commit-Queue: David Pennington <[email protected]>
Reviewed-by: Nico Weber <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1297180}
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index cfc1363..392ffc2 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -2256,6 +2256,15 @@
 #if !BUILDFLAG(IS_ANDROID)
   registry->RegisterIntegerPref(prefs::kChromeDataRegionSetting, 0);
 #endif
+
+  registry->RegisterBooleanPref(prefs::kTabGroupsDeletionSkipDialogOnDelete,
+                                false);
+  registry->RegisterBooleanPref(prefs::kTabGroupsDeletionSkipDialogOnUngroup,
+                                false);
+  registry->RegisterBooleanPref(prefs::kTabGroupsDeletionSkipDialogOnRemoveTab,
+                                false);
+  registry->RegisterBooleanPref(prefs::kTabGroupsDeletionSkipDialogOnCloseTab,
+                                false);
 }
 
 void RegisterUserProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
diff --git a/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.cc b/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.cc
index 7a87c175..2950d373 100644
--- a/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.cc
+++ b/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.cc
@@ -9,9 +9,12 @@
 
 #include "base/functional/callback.h"
 #include "base/no_destructor.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
 #include "ui/base/models/dialog_model.h"
 
 namespace tab_groups {
@@ -60,6 +63,7 @@
   const std::u16string ok_text;
 };
 
+// Returns the list of strings that are needed for a given dialog type.
 DialogText GetDialogText(DeletionDialogController::DialogType type) {
   switch (type) {
     case DeletionDialogController::DialogType::DeleteSingle: {
@@ -79,12 +83,71 @@
   }
 }
 
+// Returns the the value from the settings pref for a given dialog type.
+bool IsDialogSkippedByUserSettings(Profile* profile,
+                                   DeletionDialogController::DialogType type) {
+  if (!profile) {
+    return false;
+  }
+  PrefService* pref_service = profile->GetPrefs();
+  switch (type) {
+    case DeletionDialogController::DialogType::DeleteSingle: {
+      return pref_service->GetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnDelete);
+    }
+    case DeletionDialogController::DialogType::UngroupSingle: {
+      return pref_service->GetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnUngroup);
+    }
+    case DeletionDialogController::DialogType::RemoveTabAndDelete: {
+      return pref_service->GetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnRemoveTab);
+    }
+    case DeletionDialogController::DialogType::CloseTabAndDelete: {
+      return pref_service->GetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnCloseTab);
+    }
+  }
+}
+
+void SetSkipDialogForType(Profile* profile,
+                          DeletionDialogController::DialogType type,
+                          bool new_value) {
+  if (!profile) {
+    return;
+  }
+
+  PrefService* pref_service = profile->GetPrefs();
+  switch (type) {
+    case DeletionDialogController::DialogType::DeleteSingle: {
+      return pref_service->SetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnDelete, new_value);
+    }
+    case DeletionDialogController::DialogType::UngroupSingle: {
+      return pref_service->SetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnUngroup, new_value);
+    }
+    case DeletionDialogController::DialogType::RemoveTabAndDelete: {
+      return pref_service->SetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnRemoveTab, new_value);
+    }
+    case DeletionDialogController::DialogType::CloseTabAndDelete: {
+      return pref_service->SetBoolean(
+          prefs::kTabGroupsDeletionSkipDialogOnCloseTab, new_value);
+    }
+  }
+}
+
 }  // anonymous namespace
 
 DeletionDialogController::DialogState::DialogState(
+    DialogType type_,
+    ui::DialogModel* dialog_model_,
     base::OnceCallback<void()> on_ok_button_pressed_,
     base::OnceCallback<void()> on_cancel_button_pressed_)
-    : on_ok_button_pressed(std::move(on_ok_button_pressed_)),
+    : type(type_),
+      dialog_model(dialog_model_),
+      on_ok_button_pressed(std::move(on_ok_button_pressed_)),
       on_cancel_button_pressed(std::move(on_cancel_button_pressed_)) {}
 
 DeletionDialogController::DialogState::~DialogState() = default;
@@ -102,22 +165,33 @@
   return state_ != nullptr;
 }
 
-// Attempt to show the dialog. The dialog will only show if it is not already
-// showing.
 bool DeletionDialogController::MaybeShowDialog(
     DialogType type,
     base::OnceCallback<void()> on_ok_callback) {
   if (!CanShowDialog()) {
     return false;
   }
-  state_ = std::make_unique<DeletionDialogController::DialogState>(
-      std::move(on_ok_callback), base::DoNothing());
 
-  chrome::ShowBrowserModal(browser_, BuildDialogModel(type));
+  if (IsDialogSkippedByUserSettings(browser_->profile(), type)) {
+    return false;
+  }
+
+  std::unique_ptr<ui::DialogModel> dialog_model = BuildDialogModel(type);
+
+  state_ = std::make_unique<DeletionDialogController::DialogState>(
+      type, dialog_model.get(), std::move(on_ok_callback), base::DoNothing());
+
+  chrome::ShowBrowserModal(browser_, std::move(dialog_model));
   return true;
 }
 
 void DeletionDialogController::OnDialogOk() {
+  if (state_->dialog_model &&
+      state_->dialog_model
+          ->GetCheckboxByUniqueId(kDeletionDialogDontAskCheckboxId)
+          ->is_checked()) {
+    SetSkipDialogForType(browser_->profile(), state_->type, true);
+  }
   std::move(state_->on_ok_button_pressed).Run();
   state_.reset();
 }
diff --git a/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.h b/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.h
index 2cb229b..8527d12 100644
--- a/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.h
+++ b/chrome/browser/ui/tabs/tab_group_deletion_dialog_controller.h
@@ -35,10 +35,19 @@
 
   // State object that represents the current dialog that is being shown.
   struct DialogState {
-    DialogState(base::OnceClosure on_ok_button_pressed_,
+    DialogState(DialogType type_,
+                ui::DialogModel* dialog_model_,
+                base::OnceClosure on_ok_button_pressed_,
                 base::OnceClosure on_cancel_button_pressed_);
     ~DialogState();
 
+    // The type the dialog was initiated with.
+    DialogType type;
+
+    // A ptr to the original dialog model. Used to access the checkbox value
+    // for setting the preference.
+    raw_ptr<ui::DialogModel> dialog_model;
+
     // Callback that runs when the OK button is pressed.
     base::OnceClosure on_ok_button_pressed;
 
@@ -62,7 +71,7 @@
   void SimulateOkButtonForTesting() { OnDialogOk(); }
 
   // Attempt to show the dialog. The dialog will only show if it is not already
-  // showing.
+  // showing, and if the skip dialog option hasn't been set to true.
   bool MaybeShowDialog(DialogType type,
                        base::OnceCallback<void()> on_ok_callback);