blob: 9e7a471535f445859daec3f43c6fe8bdd94147ed [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_INPUT_METHOD_EDITOR_MEDIATOR_H_
#define CHROME_BROWSER_ASH_INPUT_METHOD_EDITOR_MEDIATOR_H_
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ash/input_method/editor_announcer.h"
#include "chrome/browser/ash/input_method/editor_client_connector.h"
#include "chrome/browser/ash/input_method/editor_consent_store.h"
#include "chrome/browser/ash/input_method/editor_event_proxy.h"
#include "chrome/browser/ash/input_method/editor_event_sink.h"
#include "chrome/browser/ash/input_method/editor_geolocation_provider.h"
#include "chrome/browser/ash/input_method/editor_metrics_recorder.h"
#include "chrome/browser/ash/input_method/editor_panel_manager.h"
#include "chrome/browser/ash/input_method/editor_query_context.h"
#include "chrome/browser/ash/input_method/editor_service_connector.h"
#include "chrome/browser/ash/input_method/editor_switch.h"
#include "chrome/browser/ash/input_method/editor_system_actuator.h"
#include "chrome/browser/ash/input_method/editor_text_query_provider.h"
#include "chrome/browser/ash/input_method/editor_transition_enums.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/ash/mako/mako_bubble_coordinator.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_consent_status.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_mode.h"
#include "chromeos/ash/components/editor_menu/public/cpp/editor_text_selection_mode.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "ui/display/display_observer.h"
namespace display {
enum class TabletState;
} // namespace display
namespace ash {
namespace input_method {
// Acts as a central "connector" for all things related to the orca project.
// This includes all current (and future) trigger points, providing the required
// plumbing to broker mojo connections from WebUIs and other clients, and
// providing an overall unified interface for the backend of the project.
class EditorMediator : public EditorContext::Observer,
public EditorContext::System,
public EditorEventSink,
public EditorPanelManagerImpl::Delegate,
public EditorSwitch::Observer,
public EditorSystemActuator::System,
public display::DisplayObserver,
public KeyedService {
public:
EditorMediator(
Profile* profile,
std::unique_ptr<EditorGeolocationProvider> editor_geolocation_provider);
~EditorMediator() override;
// Binds a new editor instance request from a client.
void BindEditorClient(mojo::PendingReceiver<orca::mojom::EditorClient>
pending_receiver) override;
// EditorContext::Observer
void OnContextUpdated() override;
void OnImeChange(std::string_view engine_id) override;
// EditorContext::System
std::optional<ukm::SourceId> GetUkmSourceId() override;
// EditorEventSink overrides
void OnFocus(int context_id) override;
void OnBlur() override;
void OnActivateIme(std::string_view engine_id) override;
void OnSurroundingTextChanged(const std::u16string& text,
gfx::Range selection_range) override;
// EditorPanelManager::Delegate overrides
void OnPromoCardDeclined() override;
// TODO(b/301869966): Consider removing default parameters once the context
// menu Orca entry is removed.
void HandleTrigger(
std::optional<std::string_view> preset_query_id = std::nullopt,
std::optional<std::string_view> freeform_text = std::nullopt) override;
chromeos::editor_menu::EditorMode GetEditorMode() const override;
chromeos::editor_menu::EditorTextSelectionMode GetEditorTextSelectionMode()
const override;
chromeos::editor_menu::EditorConsentStatus GetConsentStatus() const override;
// This method is currently used for metric purposes to understand the ratio
// of requests being blocked vs. the potential requests that can be
// accommodated.
EditorOpportunityMode GetEditorOpportunityMode() const override;
std::vector<EditorBlockedReason> GetBlockedReasons() const override;
void CacheContext() override;
EditorMetricsRecorder* GetMetricsRecorder() override;
// display::DisplayObserver overrides
void OnDisplayTabletStateChanged(display::TabletState state) override;
// EditorSystemActuator::System overrides
void Announce(const std::u16string& message) override;
// EditorSystemActuator::System / EditorPanelManagerImpl::Delegate override
void ProcessConsentAction(ConsentAction consent_action) override;
void ShowUI() override;
void CloseUI() override;
size_t GetSelectedTextLength() override;
// EditorSwitch::Observer overrides
void OnEditorModeChanged(chromeos::editor_menu::EditorMode mode) override;
// KeyedService overrides
void Shutdown() override;
void ShowNotice(EditorNoticeTransitionAction transition_action);
// Checks if the feature should be visible.
bool IsAllowedForUse();
// Checks if feedbacks can be accessed.
bool CanAccessFeedback();
// Checks if the review notice banner can be shown in the settings page.
bool CanShowNoticeBanner() const;
EditorPanelManagerImpl* panel_manager() { return &panel_manager_; }
MakoBubbleCoordinator& mako_bubble_coordinator_for_testing() {
return mako_bubble_coordinator_;
}
bool SetTextQueryProviderResponseForTesting(
const std::vector<std::string>& mock_results);
void FetchAndUpdateInputContextForTesting();
void OverrideEditorModeForTesting(
chromeos::editor_menu::EditorMode editor_mode);
private:
struct SurroundingText {
std::u16string text;
gfx::Range selection_range;
};
class ServiceConnection {
public:
ServiceConnection(Profile* profile,
EditorMediator* mediator,
EditorMetricsRecorder* metrics_recorder,
EditorServiceConnector* service_connector);
~ServiceConnection();
EditorEventProxy* editor_event_proxy();
EditorClientConnector* editor_client_connector();
EditorTextQueryProvider* text_query_provider();
EditorSystemActuator* system_actuator();
private:
std::unique_ptr<EditorEventProxy> editor_event_proxy_;
std::unique_ptr<EditorClientConnector> editor_client_connector_;
std::unique_ptr<EditorTextQueryProvider> text_query_provider_;
std::unique_ptr<EditorSystemActuator> system_actuator_;
};
void OnTextFieldContextualInfoChanged(const TextFieldContextualInfo& info);
void OnEditorServiceConnected(bool is_connection_bound);
bool IsServiceConnected();
void ResetEditorConnections();
bool GetUserPref();
void SetUserPref(bool value);
// Not owned by this class
raw_ptr<Profile> profile_;
EditorPanelManagerImpl panel_manager_;
std::unique_ptr<EditorGeolocationProvider> editor_geolocation_provider_;
MakoBubbleCoordinator mako_bubble_coordinator_;
EditorContext editor_context_;
std::unique_ptr<EditorSwitch> editor_switch_;
std::unique_ptr<EditorMetricsRecorder> metrics_recorder_;
std::unique_ptr<EditorConsentStore> consent_store_;
std::unique_ptr<EditorServiceConnector> editor_service_connector_;
std::unique_ptr<ServiceConnection> service_connection_;
EditorLiveRegionAnnouncer announcer_;
SurroundingText surrounding_text_;
std::optional<chromeos::editor_menu::EditorMode>
editor_mode_override_for_testing_;
std::optional<EditorQueryContext> query_context_;
display::ScopedDisplayObserver display_observer_{this};
base::WeakPtrFactory<EditorMediator> weak_ptr_factory_{this};
};
} // namespace input_method
} // namespace ash
#endif // CHROME_BROWSER_ASH_INPUT_METHOD_EDITOR_MEDIATOR_H_