[SHoA] Refactor the menu notification service for use in magic stack

- Disable the extensions and password result fetching on Android.
- Enable the menu notifications service on Android.

Bug: 324562205
Change-Id: Ia3878f64560a1277854006bab1f46bee473d5ed1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5661403
Commit-Queue: Rubin Deliallisi <[email protected]>
Reviewed-by: Alex Ilin <[email protected]>
Reviewed-by: Side YILMAZ <[email protected]>
Code-Coverage: [email protected] <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1320944}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 3b30ced..42eed04 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -17853,6 +17853,29 @@
     <message name="IDS_EXPERIMENTAL_FEATURE_DISCLAIMER" desc="Text used for experimental features.">
       This is an experimental AI feature.
     </message>
+
+    <!-- Safety Hub elements. -->
+    <!-- TODO(crbug.com/324562205): Make strings translateable once finalized. -->
+    <if expr="is_android">
+        <message name="IDS_SETTINGS_SAFETY_HUB_SAFE_BROWSING_MENU_NOTIFICATION" translateable="false">
+          Get protection against dangerous sites
+        </message>
+        <message name="IDS_SETTINGS_SAFETY_HUB_REVIEW_NOTIFICATION_PERMISSIONS_MENU_NOTIFICATION" translateable="false">
+          {NUM_SITES, plural,
+          =1 {Found 1 site with lots of notifications}
+          other {Found {NUM_SITES} sites with lots of notifications}}
+        </message>
+        <message name="IDS_SETTINGS_SAFETY_HUB_REVOKED_PERMISSIONS_MENU_NOTIFICATION" translateable="false">
+          {NUM_SITES, plural,
+          =1 {Chrome removed permissions for 1 site}
+          other {Chrome removed permissions for {NUM_SITES} sites}}
+        </message>
+        <message name="IDS_SETTINGS_SAFETY_HUB_UNUSED_SITE_PERMISSIONS_MENU_NOTIFICATION" translateable="false">
+          {NUM_SITES, plural,
+          =1 {Chrome removed permissions for 1 unused site}
+          other {Chrome removed permissions for {NUM_SITES} ununsed sites}}
+        </message>
+    </if>
   </messages>
 </release>
 </grit>
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 62ac1991..9c8805c 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -79,6 +79,7 @@
 #include "chrome/browser/ui/network_profile_bubble.h"
 #include "chrome/browser/ui/performance_controls/performance_controls_metrics.h"
 #include "chrome/browser/ui/prefs/prefs_tab_helper.h"
+#include "chrome/browser/ui/safety_hub/safety_hub_prefs.h"
 #include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble.h"
 #include "chrome/browser/ui/tabs/organization/prefs.h"
@@ -296,7 +297,6 @@
 #include "chrome/browser/signin/signin_promo.h"
 #include "chrome/browser/ui/commerce/commerce_ui_tab_helper.h"
 #include "chrome/browser/ui/lens/lens_overlay_permission_utils.h"
-#include "chrome/browser/ui/safety_hub/safety_hub_prefs.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
 #include "chrome/browser/ui/webui/cr_components/theme_color_picker/theme_color_picker_handler.h"
 #include "chrome/browser/ui/webui/history/foreign_session_handler.h"
@@ -1864,6 +1864,7 @@
   QuietNotificationPermissionUiState::RegisterProfilePrefs(registry);
   RegisterBrowserUserPrefs(registry);
   RegisterPrefersDefaultScrollbarStylesPrefs(registry);
+  RegisterSafetyHubProfilePrefs(registry);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   settings::ResetSettingsHandler::RegisterProfilePrefs(registry);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -1992,7 +1993,6 @@
   PromoService::RegisterProfilePrefs(registry);
   RecipesService::RegisterProfilePrefs(registry);
   RegisterReadAnythingProfilePrefs(registry);
-  RegisterSafetyHubProfilePrefs(registry);
   settings::SettingsUI::RegisterProfilePrefs(registry);
   send_tab_to_self::RegisterProfilePrefs(registry);
   signin::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 556f339e..8b55cf9f 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -202,6 +202,7 @@
 #include "chrome/browser/ui/hats/hats_service_factory.h"
 #include "chrome/browser/ui/media_router/cast_notification_controller_lacros_factory.h"
 #include "chrome/browser/ui/prefs/prefs_tab_helper.h"
+#include "chrome/browser/ui/safety_hub/menu_notification_service_factory.h"
 #include "chrome/browser/ui/safety_hub/notification_permission_review_service_factory.h"
 #include "chrome/browser/ui/safety_hub/unused_site_permissions_service_factory.h"
 #include "chrome/browser/ui/tabs/pinned_tab_service_factory.h"
@@ -491,7 +492,6 @@
 #include "chrome/browser/speech/speech_recognition_service_factory.h"
 #include "chrome/browser/ui/global_media_controls/media_notification_service_factory.h"
 #include "chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h"
-#include "chrome/browser/ui/safety_hub/menu_notification_service_factory.h"
 #include "chrome/browser/ui/safety_hub/password_status_check_service_factory.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_hats_service_factory.h"
 #include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h"
@@ -1163,7 +1163,11 @@
   safe_browsing::TailoredSecurityServiceFactory::GetInstance();
   safe_browsing::VerdictCacheManagerFactory::GetInstance();
   SafeSearchFactory::GetInstance();
-#if !BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_ANDROID)
+  if (base::FeatureList::IsEnabled(features::kSafetyHub)) {
+    SafetyHubMenuNotificationServiceFactory::GetInstance();
+  }
+#else
   SafetyHubMenuNotificationServiceFactory::GetInstance();
   SafetyHubHatsServiceFactory::GetInstance();
 #endif
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index f9f254d..f5da8077 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -179,12 +179,22 @@
     "recently_audible_helper.h",
     "safety_hub/abusive_notification_permissions_manager.cc",
     "safety_hub/abusive_notification_permissions_manager.h",
+    "safety_hub/menu_notification.cc",
+    "safety_hub/menu_notification.h",
+    "safety_hub/menu_notification_service.cc",
+    "safety_hub/menu_notification_service.h",
+    "safety_hub/menu_notification_service_factory.cc",
+    "safety_hub/menu_notification_service_factory.h",
     "safety_hub/notification_permission_review_service.cc",
     "safety_hub/notification_permission_review_service.h",
     "safety_hub/notification_permission_review_service_factory.cc",
     "safety_hub/notification_permission_review_service_factory.h",
+    "safety_hub/safe_browsing_result.cc",
+    "safety_hub/safe_browsing_result.h",
     "safety_hub/safety_hub_constants.cc",
     "safety_hub/safety_hub_constants.h",
+    "safety_hub/safety_hub_prefs.cc",
+    "safety_hub/safety_hub_prefs.h",
     "safety_hub/safety_hub_service.cc",
     "safety_hub/safety_hub_service.h",
     "safety_hub/safety_hub_util.cc",
@@ -1379,26 +1389,16 @@
       "safety_hub/card_data_helper.h",
       "safety_hub/extensions_result.cc",
       "safety_hub/extensions_result.h",
-      "safety_hub/menu_notification.cc",
-      "safety_hub/menu_notification.h",
-      "safety_hub/menu_notification_service.cc",
-      "safety_hub/menu_notification_service.h",
-      "safety_hub/menu_notification_service_factory.cc",
-      "safety_hub/menu_notification_service_factory.h",
       "safety_hub/password_status_check_result.cc",
       "safety_hub/password_status_check_result.h",
       "safety_hub/password_status_check_service.cc",
       "safety_hub/password_status_check_service.h",
       "safety_hub/password_status_check_service_factory.cc",
       "safety_hub/password_status_check_service_factory.h",
-      "safety_hub/safe_browsing_result.cc",
-      "safety_hub/safe_browsing_result.h",
       "safety_hub/safety_hub_hats_service.cc",
       "safety_hub/safety_hub_hats_service.h",
       "safety_hub/safety_hub_hats_service_factory.cc",
       "safety_hub/safety_hub_hats_service_factory.h",
-      "safety_hub/safety_hub_prefs.cc",
-      "safety_hub/safety_hub_prefs.h",
       "scoped_tabbed_browser_displayer.cc",
       "scoped_tabbed_browser_displayer.h",
       "search/instant_controller.cc",
diff --git a/chrome/browser/ui/safety_hub/menu_notification_service.cc b/chrome/browser/ui/safety_hub/menu_notification_service.cc
index 51ce219d..9de90d6 100644
--- a/chrome/browser/ui/safety_hub/menu_notification_service.cc
+++ b/chrome/browser/ui/safety_hub/menu_notification_service.cc
@@ -11,7 +11,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/ui/safety_hub/extensions_result.h"
+#include "build/build_config.h"
 #include "chrome/browser/ui/safety_hub/menu_notification.h"
 #include "chrome/browser/ui/safety_hub/notification_permission_review_service.h"
 #include "chrome/browser/ui/safety_hub/safe_browsing_result.h"
@@ -22,6 +22,9 @@
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/safety_hub/extensions_result.h"
+#endif  // BUILDFLAG(IS_ANDROID)
 namespace {
 SafetyHubModuleInfoElement::SafetyHubModuleInfoElement() = default;
 SafetyHubModuleInfoElement::~SafetyHubModuleInfoElement() = default;
@@ -43,8 +46,10 @@
     PrefService* pref_service,
     UnusedSitePermissionsService* unused_site_permissions_service,
     NotificationPermissionsReviewService* notification_permissions_service,
+#if !BUILDFLAG(IS_ANDROID)
     extensions::CWSInfoService* extension_info_service,
     PasswordStatusCheckService* password_check_service,
+#endif  // BUILDFLAG(IS_ANDROID)
     Profile* profile) {
   pref_service_ = std::move(pref_service);
   const base::Value::Dict& stored_notifications =
@@ -56,14 +61,7 @@
       {safety_hub::SafetyHubModuleType::NOTIFICATION_PERMISSIONS,
        "notification-permissions"},
       {safety_hub::SafetyHubModuleType::SAFE_BROWSING, "safe-browsing"},
-      {safety_hub::SafetyHubModuleType::EXTENSIONS, "extensions"},
   };
-  // PasswordStatusCheckService might be null for some profiles and testing. Add
-  // to the dictionary only if the service is available.
-  if (password_check_service) {
-    pref_dict_key_map_.emplace(safety_hub::SafetyHubModuleType::PASSWORDS,
-                               "passwords");
-  }
 
   // TODO(crbug.com/40267370): Make the interval for each service finch
   // configurable.
@@ -86,15 +84,25 @@
                  base::BindRepeating(&SafetyHubSafeBrowsingResult::GetResult,
                                      base::Unretained(pref_service)),
                  stored_notifications);
+
+// Extensions are not available on Android, so we cannot fetch any information
+// about them. Passwords are handled by GMS Core on Android and our
+// PasswordStatusCheckService is not compatible with GMS Core.
+#if !BUILDFLAG(IS_ANDROID)
+  pref_dict_key_map_.emplace(safety_hub::SafetyHubModuleType::EXTENSIONS,
+                             "extensions");
   SetInfoElement(safety_hub::SafetyHubModuleType::EXTENSIONS,
                  MenuNotificationPriority::LOW, base::Days(10),
                  base::BindRepeating(&SafetyHubExtensionsResult::GetResult,
                                      base::Unretained(extension_info_service),
                                      profile, true),
                  stored_notifications);
+
   // PasswordStatusCheckService might be null for some profiles and testing. Add
   // the info item only if the service is available.
   if (password_check_service) {
+    pref_dict_key_map_.emplace(safety_hub::SafetyHubModuleType::PASSWORDS,
+                               "passwords");
     SetInfoElement(
         safety_hub::SafetyHubModuleType::PASSWORDS,
         MenuNotificationPriority::HIGH, base::Days(0),
@@ -102,6 +110,7 @@
                             base::Unretained(password_check_service)),
         stored_notifications);
   }
+#endif  // BUILDFLAG(IS_ANDROID)
 
   // Listen for changes to the Safe Browsing pref to accommodate the trigger
   // logic.
diff --git a/chrome/browser/ui/safety_hub/menu_notification_service.h b/chrome/browser/ui/safety_hub/menu_notification_service.h
index b4b0a2b..a42b2cdc 100644
--- a/chrome/browser/ui/safety_hub/menu_notification_service.h
+++ b/chrome/browser/ui/safety_hub/menu_notification_service.h
@@ -11,15 +11,19 @@
 #include <optional>
 
 #include "base/time/time.h"
-#include "chrome/browser/extensions/cws_info_service.h"
+#include "build/build_config.h"
 #include "chrome/browser/ui/safety_hub/menu_notification.h"
 #include "chrome/browser/ui/safety_hub/notification_permission_review_service.h"
-#include "chrome/browser/ui/safety_hub/password_status_check_service.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_constants.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_service.h"
 #include "chrome/browser/ui/safety_hub/unused_site_permissions_service.h"
 #include "components/keyed_service/core/keyed_service.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/extensions/cws_info_service.h"
+#include "chrome/browser/ui/safety_hub/password_status_check_service.h"
+#endif  // BUILDFLAG(IS_ANDROID)
+
 struct MenuNotificationEntry {
   int command = 0;
   std::u16string label;
@@ -69,8 +73,10 @@
       PrefService* pref_service,
       UnusedSitePermissionsService* unused_site_permissions_service,
       NotificationPermissionsReviewService* notification_permissions_service,
+#if !BUILDFLAG(IS_ANDROID)
       extensions::CWSInfoService* extension_info_service,
       PasswordStatusCheckService* password_check_service,
+#endif  // BUILDFLAG(IS_ANDROID)
       Profile* profile);
   SafetyHubMenuNotificationService(const SafetyHubMenuNotificationService&) =
       delete;
diff --git a/chrome/browser/ui/safety_hub/menu_notification_service_factory.cc b/chrome/browser/ui/safety_hub/menu_notification_service_factory.cc
index f04b25b..185255f4 100644
--- a/chrome/browser/ui/safety_hub/menu_notification_service_factory.cc
+++ b/chrome/browser/ui/safety_hub/menu_notification_service_factory.cc
@@ -4,19 +4,25 @@
 
 #include "chrome/browser/ui/safety_hub/menu_notification_service_factory.h"
 
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
+#include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/safety_hub/menu_notification_service.h"
 #include "chrome/browser/ui/safety_hub/notification_permission_review_service.h"
 #include "chrome/browser/ui/safety_hub/notification_permission_review_service_factory.h"
-#include "chrome/browser/ui/safety_hub/password_status_check_service_factory.h"
 #include "chrome/browser/ui/safety_hub/safety_hub_service.h"
 #include "chrome/browser/ui/safety_hub/unused_site_permissions_service.h"
 #include "chrome/browser/ui/safety_hub/unused_site_permissions_service_factory.h"
+#include "chrome/common/chrome_features.h"
+
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/safety_hub/password_status_check_service_factory.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_prefs_factory.h"
 #include "extensions/browser/extension_registry.h"
+#endif  // BUILDFLAG(IS_ANDROID)
 
 // static
 SafetyHubMenuNotificationServiceFactory*
@@ -41,8 +47,10 @@
               .Build()) {
   DependsOn(UnusedSitePermissionsServiceFactory::GetInstance());
   DependsOn(NotificationPermissionsReviewServiceFactory::GetInstance());
+#if !BUILDFLAG(IS_ANDROID)
   DependsOn(PasswordStatusCheckServiceFactory::GetInstance());
   DependsOn(extensions::ExtensionPrefsFactory::GetInstance());
+#endif  // BUIDFLAG(IS_ANDROID)
 }
 
 SafetyHubMenuNotificationServiceFactory::
@@ -56,6 +64,11 @@
       UnusedSitePermissionsServiceFactory::GetForProfile(profile);
   NotificationPermissionsReviewService* notification_permission_review_service =
       NotificationPermissionsReviewServiceFactory::GetForProfile(profile);
+#if BUILDFLAG(IS_ANDROID)
+  return std::make_unique<SafetyHubMenuNotificationService>(
+      profile->GetPrefs(), unused_site_permissions_service,
+      notification_permission_review_service, profile);
+#else
   extensions::CWSInfoService* extension_info_service =
       extensions::CWSInfoService::Get(profile);
   PasswordStatusCheckService* password_check_service =
@@ -64,4 +77,5 @@
       profile->GetPrefs(), unused_site_permissions_service,
       notification_permission_review_service, extension_info_service,
       password_check_service, profile);
+#endif  // BUILDFLAG(IS_ANDROID)
 }
diff --git a/chrome/browser/ui/safety_hub/notification_permission_review_service.cc b/chrome/browser/ui/safety_hub/notification_permission_review_service.cc
index 4ff28e7..54d4e10 100644
--- a/chrome/browser/ui/safety_hub/notification_permission_review_service.cc
+++ b/chrome/browser/ui/safety_hub/notification_permission_review_service.cc
@@ -209,17 +209,12 @@
 
 std::u16string NotificationPermissionsReviewService::
     NotificationPermissionsResult::GetNotificationString() const {
-#if !BUILDFLAG(IS_ANDROID)
   if (notification_permissions_.empty()) {
     return std::u16string();
   }
   return l10n_util::GetPluralStringFUTF16(
       IDS_SETTINGS_SAFETY_HUB_REVIEW_NOTIFICATION_PERMISSIONS_MENU_NOTIFICATION,
       GetOrigins().size());
-#else
-  // Menu notifications are not present on Android.
-  return std::u16string();
-#endif
 }
 
 int NotificationPermissionsReviewService::NotificationPermissionsResult::
diff --git a/chrome/browser/ui/safety_hub/unused_site_permissions_service.cc b/chrome/browser/ui/safety_hub/unused_site_permissions_service.cc
index cde7c2d..238ee3b 100644
--- a/chrome/browser/ui/safety_hub/unused_site_permissions_service.cc
+++ b/chrome/browser/ui/safety_hub/unused_site_permissions_service.cc
@@ -286,7 +286,6 @@
 
 std::u16string UnusedSitePermissionsService::UnusedSitePermissionsResult::
     GetNotificationString() const {
-#if !BUILDFLAG(IS_ANDROID)
   if (revoked_permissions_.empty()) {
     return std::u16string();
   }
@@ -296,10 +295,6 @@
           ? IDS_SETTINGS_SAFETY_HUB_REVOKED_PERMISSIONS_MENU_NOTIFICATION
           : IDS_SETTINGS_SAFETY_HUB_UNUSED_SITE_PERMISSIONS_MENU_NOTIFICATION,
       revoked_permissions_.size());
-#else
-  // Menu notifications are not present on Android.
-  return std::u16string();
-#endif
 }
 
 int UnusedSitePermissionsService::UnusedSitePermissionsResult::