From ecb39c8cb278d58c6032bf138bddbbefbedf53b0 Mon Sep 17 00:00:00 2001
From: Joemer Ramos <joemerramos@chromium.org>
Date: Wed, 7 May 2025 07:23:11 -0700
Subject: [PATCH] [iOS] Create GLIC Promo Infra Part 2

This CL:
- Registers GLICPromoDisplayHandler in
registerStandardPromoDisplayHandlerPromos
- Implements a basic scene agent to pipe promo manager infra
- Starts scene agent behind kPageActionMenu flag in scene controller

This CL was meant to have incomplete code in order to make the CL size
smaller.

Follow up from: crrev.com/c/6505700

Fixed: 414805017
Change-Id: I82e784748f68ac632bc0b3b2a41ba6ec5faf4133
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6508351
Reviewed-by: Mark Cogan <marq@chromium.org>
Reviewed-by: Robbie Gibson <rkgibson@google.com>
Commit-Queue: Joemer Ramos <joemerramos@google.com>
Cr-Commit-Position: refs/heads/main@{#1456980}
---
 .../intelligence/glic/coordinator/BUILD.gn    |  5 ++
 .../intelligence/glic/coordinator/DEPS        |  3 ++
 .../glic/coordinator/glic_promo_scene_agent.h | 22 ++++++++
 .../coordinator/glic_promo_scene_agent.mm     | 50 +++++++++++++++++++
 .../promos_manager/ui_bundled/BUILD.gn        |  1 +
 .../browser/promos_manager/ui_bundled/DEPS    |  2 +
 .../ui_bundled/promos_manager_coordinator.mm  |  8 +++
 .../browser/shared/coordinator/scene/BUILD.gn |  2 +
 .../browser/shared/coordinator/scene/DEPS     |  2 +
 .../coordinator/scene/scene_controller.mm     |  7 +++
 10 files changed, 102 insertions(+)
 create mode 100644 ios/chrome/browser/intelligence/glic/coordinator/DEPS
 create mode 100644 ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h
 create mode 100644 ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm

diff --git a/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn b/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn
index db153ad4aae2b..99c4d7b7810aa 100644
--- a/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn
+++ b/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn
@@ -9,12 +9,17 @@ source_set("coordinator") {
     "glic_consent_mediator.h",
     "glic_consent_mediator.mm",
     "glic_consent_mediator_delegate.h",
+    "glic_promo_scene_agent.h",
+    "glic_promo_scene_agent.mm",
   ]
   deps = [
     "//base",
     "//components/prefs:prefs",
     "//ios/chrome/browser/intelligence/glic/ui",
+    "//ios/chrome/browser/promos_manager/model",
+    "//ios/chrome/browser/promos_manager/model:constants",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
+    "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile",
   ]
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/DEPS b/ios/chrome/browser/intelligence/glic/coordinator/DEPS
new file mode 100644
index 0000000000000..e91d7d6c131f3
--- /dev/null
+++ b/ios/chrome/browser/intelligence/glic/coordinator/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ios/chrome/browser/promos_manager/model",
+]
\ No newline at end of file
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h
new file mode 100644
index 0000000000000..d183ddcd3472e
--- /dev/null
+++ b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h
@@ -0,0 +1,22 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_COORDINATOR_GLIC_PROMO_SCENE_AGENT_H_
+#define IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_COORDINATOR_GLIC_PROMO_SCENE_AGENT_H_
+
+#import <Foundation/Foundation.h>
+
+#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h"
+
+class PromosManager;
+
+// A scene agent that registers the GLIC promo in the promo manager on
+// SceneActivationLevelForegroundActive.
+@interface GLICPromoSceneAgent : ObservingSceneAgent
+
+- (instancetype)initWithPromosManager:(PromosManager*)promosManager;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_COORDINATOR_GLIC_PROMO_SCENE_AGENT_H_
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm
new file mode 100644
index 0000000000000..1a11385f80bde
--- /dev/null
+++ b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm
@@ -0,0 +1,50 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h"
+
+#import "base/memory/raw_ptr.h"
+#import "ios/chrome/browser/promos_manager/model/constants.h"
+#import "ios/chrome/browser/promos_manager/model/promos_manager.h"
+
+@implementation GLICPromoSceneAgent {
+  raw_ptr<PromosManager> _promosManager;
+}
+
+- (instancetype)initWithPromosManager:(PromosManager*)promosManager {
+  self = [super init];
+  if (self) {
+    _promosManager = promosManager;
+  }
+  return self;
+}
+
+#pragma mark - SceneStateObserver
+
+- (void)sceneState:(SceneState*)sceneState
+    transitionedToActivationLevel:(SceneActivationLevel)level {
+  switch (level) {
+    case SceneActivationLevelForegroundActive: {
+      [self registerPromoForSingleDisplay];
+      break;
+    }
+    case SceneActivationLevelUnattached:
+    case SceneActivationLevelBackground:
+    case SceneActivationLevelDisconnected:
+    case SceneActivationLevelForegroundInactive: {
+      break;
+    }
+  }
+}
+
+#pragma mark - Private
+
+// Register the What's New promo for a single display in the promo manager.
+- (void)registerPromoForSingleDisplay {
+  DCHECK(_promosManager);
+  _promosManager->RegisterPromoForSingleDisplay(
+      promos_manager::Promo::GLICPromo);
+}
+
+@end
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn b/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
index e2f7e9cbe5ccd..cfcb41dfa224a 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/promos_manager/ui_bundled/BUILD.gn
@@ -102,6 +102,7 @@ source_set("ui_bundled") {
     "//ios/chrome/browser/docking_promo/ui",
     "//ios/chrome/browser/first_run/ui_bundled:features",
     "//ios/chrome/browser/first_run/ui_bundled/welcome_back/ui",
+    "//ios/chrome/browser/intelligence/features",
     "//ios/chrome/browser/intelligence/glic/ui",
     "//ios/chrome/browser/post_restore_signin/ui_bundled",
     "//ios/chrome/browser/promos_manager/model:constants",
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/DEPS b/ios/chrome/browser/promos_manager/ui_bundled/DEPS
index c5dea75ae2722..89afe0e29f1a5 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/DEPS
+++ b/ios/chrome/browser/promos_manager/ui_bundled/DEPS
@@ -5,6 +5,8 @@ include_rules = [
   "+ios/chrome/browser/default_promo/ui_bundled",
   "+ios/chrome/browser/docking_promo/ui/docking_promo_display_handler.h",
   "+ios/chrome/browser/feature_engagement/model/tracker_factory.h",
+  "+ios/chrome/browser/intelligence/features",
+  "+ios/chrome/browser/intelligence/glic/ui",
   "+ios/chrome/browser/post_restore_signin/ui_bundled",
   "+ios/chrome/browser/signin/model",
   "+ios/chrome/browser/sync/model/sync_service_factory.h",
diff --git a/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm b/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
index 8e8b8235b3a8f..78c3af92d4de9 100644
--- a/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
+++ b/ios/chrome/browser/promos_manager/ui_bundled/promos_manager_coordinator.mm
@@ -37,6 +37,8 @@
 #import "ios/chrome/browser/feature_engagement/model/tracker_factory.h"
 #import "ios/chrome/browser/first_run/ui_bundled/features.h"
 #import "ios/chrome/browser/first_run/ui_bundled/welcome_back/ui/welcome_back_display_handler.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
+#import "ios/chrome/browser/intelligence/glic/ui/glic_promo_display_handler.h"
 #import "ios/chrome/browser/post_restore_signin/ui_bundled/post_restore_signin_provider.h"
 #import "ios/chrome/browser/promos_manager/model/features.h"
 #import "ios/chrome/browser/promos_manager/model/promo_config.h"
@@ -618,6 +620,12 @@
     _displayHandlerPromos[promos_manager::Promo::WelcomeBack] =
         [[WelcomeBackDisplayHandler alloc] init];
   }
+
+  // GLIC promo handler.
+  if (IsPageActionMenuEnabled()) {
+    _displayHandlerPromos[promos_manager::Promo::GLICPromo] =
+        [[GLICPromoDisplayHandler alloc] init];
+  }
 }
 
 - (void)registerStandardPromoViewProviderPromos {
diff --git a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
index d0b5a51554fe4..87794ed097594 100644
--- a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
+++ b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
@@ -131,6 +131,8 @@ source_set("scene") {
     "//ios/chrome/browser/incognito_interstitial/ui_bundled:coordinator",
     "//ios/chrome/browser/incognito_reauth/ui_bundled:incognito_reauth_scene_agent",
     "//ios/chrome/browser/infobars/model",
+    "//ios/chrome/browser/intelligence/features",
+    "//ios/chrome/browser/intelligence/glic/coordinator",
     "//ios/chrome/browser/intents/model:user_activity_browser_agent",
     "//ios/chrome/browser/lens/ui_bundled:lens_entrypoint",
     "//ios/chrome/browser/lens_overlay/model",
diff --git a/ios/chrome/browser/shared/coordinator/scene/DEPS b/ios/chrome/browser/shared/coordinator/scene/DEPS
index b52a2d9239fc3..13f61548e60ed 100644
--- a/ios/chrome/browser/shared/coordinator/scene/DEPS
+++ b/ios/chrome/browser/shared/coordinator/scene/DEPS
@@ -17,6 +17,8 @@ include_rules = [
   "+ios/chrome/browser/incognito_interstitial/ui_bundled",
   "+ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_scene_agent.h",
   "+ios/chrome/browser/infobars/model",
+  "+ios/chrome/browser/intelligence/features",
+  "+ios/chrome/browser/intelligence/glic/coordinator",
   "+ios/chrome/browser/intents/model",
   "+ios/chrome/browser/lens/ui_bundled",
   "+ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h",
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index 7265ca6331360..4db142e21114c 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -93,6 +93,8 @@
 #import "ios/chrome/browser/incognito_interstitial/ui_bundled/incognito_interstitial_coordinator_delegate.h"
 #import "ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_scene_agent.h"
 #import "ios/chrome/browser/infobars/model/infobar_manager_impl.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
+#import "ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h"
 #import "ios/chrome/browser/intents/model/user_activity_browser_agent.h"
 #import "ios/chrome/browser/lens/ui_bundled/lens_entrypoint.h"
 #import "ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h"
@@ -1356,6 +1358,11 @@ SystemIdentityManager::IteratorResult IdentitiesOnDevice(
                           syncService:SyncServiceFactory::GetForProfile(profile)
                           prefService:prefService]];
   }
+
+  if (IsPageActionMenuEnabled()) {
+    [sceneState addAgent:[[GLICPromoSceneAgent alloc]
+                             initWithPromosManager:promosManager]];
+  }
 }
 
 // Determines the mode (normal or incognito) the initial UI should be in.