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.