#ifndef CHROME_BROWSER_COMPOSE_COMPOSE_ENABLING_H_
#define CHROME_BROWSER_COMPOSE_COMPOSE_ENABLING_H_
#include <memory>
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/types/expected.h"
#include "chrome/browser/compose/proto/compose_optimization_guide.pb.h"
#include "components/autofill/core/common/aliases.h"
#include "components/compose/core/browser/compose_metrics.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/translate/core/browser/translate_manager.h"
#include "content/public/browser/context_menu_params.h"
#include "content/public/browser/render_frame_host.h"
class OptimizationGuideKeyedService;
class Profile;
namespace compose {
enum class ComposeNudgeDenyReason {
kSavedStateNotificationDisabled = 0,
kSavedStateNudgeDisabled = 1,
kProactiveNudgeDisabled = 2,
kProactiveNudgeBlocked = 3,
};
}
class ComposeEnabling {
public:
using ScopedOverride = std::unique_ptr<base::ScopedClosureRunner>;
explicit ComposeEnabling(
Profile* profile,
signin::IdentityManager* identity_manager,
OptimizationGuideKeyedService* opt_guide);
~ComposeEnabling();
ComposeEnabling(const ComposeEnabling&) = delete;
ComposeEnabling& operator=(const ComposeEnabling&) = delete;
static bool IsEnabledForProfile(Profile* profile);
static bool IsSettingVisible(Profile* profile);
base::expected<void, compose::ComposeShowStatus> IsEnabled();
static ScopedOverride ScopedEnableComposeForTesting();
static ScopedOverride ScopedSkipUserCheckForTesting();
static ScopedOverride OverrideCountryForTesting(std::string country_code);
base::expected<void, compose::ComposeShowStatus> ShouldTriggerNoStatePopup(
std::string_view autocomplete_attribute,
bool writingsuggestions_attribute,
Profile* profile,
PrefService* prefs,
translate::TranslateManager* translate_manager,
const url::Origin& top_level_frame_origin,
const url::Origin& element_frame_origin,
GURL url,
bool is_msbb_enabled);
bool ShouldTriggerSavedStatePopup(
autofill::AutofillSuggestionTriggerSource trigger_source);
bool ShouldTriggerContextMenu(Profile* profile,
translate::TranslateManager* translate_manager,
content::RenderFrameHost* rfh,
content::ContextMenuParams& params);
compose::ComposeHintDecision GetOptimizationGuidanceForUrl(const GURL& url,
Profile* profile);
bool IsPageLanguageSupported(translate::TranslateManager* translate_manager);
private:
base::expected<void, compose::ComposeShowStatus> PageLevelChecks(
translate::TranslateManager* translate_manager,
GURL url,
const url::Origin& top_level_frame_origin,
const url::Origin& element_frame_origin,
bool is_newsted_within_fenced_frame);
static base::expected<void, compose::ComposeShowStatus> CheckEnabling(
OptimizationGuideKeyedService* opt_guide,
signin::IdentityManager* identity_manager);
raw_ptr<Profile> profile_;
raw_ptr<OptimizationGuideKeyedService> opt_guide_;
raw_ptr<signin::IdentityManager> identity_manager_;
static int enabled_for_testing_;
static int skip_user_check_for_testing_;
};
#endif