#ifndef ASH_IME_IME_CONTROLLER_IMPL_H_
#define ASH_IME_IME_CONTROLLER_IMPL_H_
#include <memory>
#include <vector>
#include "ash/ash_export.h"
#include "ash/keyboard/keyboard_controller_impl.h"
#include "ash/public/cpp/ime_controller.h"
#include "ash/public/cpp/ime_controller_client.h"
#include "ash/public/cpp/ime_info.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "ui/base/ime/ash/ime_keyset.h"
namespace ui {
class Accelerator;
}
namespace ash {
class ModeIndicatorObserver;
class ASH_EXPORT ImeControllerImpl : public ImeController,
public KeyboardControllerObserver {
public:
ImeControllerImpl();
ImeControllerImpl(const ImeControllerImpl&) = delete;
ImeControllerImpl& operator=(const ImeControllerImpl&) = delete;
~ImeControllerImpl() override;
const std::vector<ImeInfo>& GetVisibleImes() const;
bool IsCurrentImeVisible() const;
const ImeInfo& current_ime() const { return current_ime_; }
bool is_extra_input_options_enabled() const {
return is_extra_input_options_enabled_;
}
bool is_emoji_enabled() const { return is_emoji_enabled_; }
bool is_handwriting_enabled() const { return is_handwriting_enabled_; }
bool is_voice_enabled() const { return is_voice_enabled_; }
bool managed_by_policy() const { return managed_by_policy_; }
bool is_menu_active() const { return is_menu_active_; }
const std::vector<ImeMenuItem>& current_ime_menu_items() const {
return current_ime_menu_items_;
}
void BindReceiver(mojo::PendingReceiver<ImeController> receiver);
bool CanSwitchIme() const;
void SwitchToNextIme();
void SwitchToLastUsedIme();
void SwitchImeById(const std::string& ime_id, bool show_message);
void ActivateImeMenuItem(const std::string& key);
void SetCapsLockEnabled(bool caps_enabled);
void OverrideKeyboardKeyset(input_method::ImeKeyset keyset);
void OverrideKeyboardKeyset(
input_method::ImeKeyset keyset,
ImeControllerClient::OverrideKeyboardKeysetCallback callback);
bool CanSwitchImeWithAccelerator(const ui::Accelerator& accelerator) const;
void SwitchImeWithAccelerator(const ui::Accelerator& accelerator);
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
void SetClient(ImeControllerClient* client) override;
void RefreshIme(const std::string& current_ime_id,
std::vector<ImeInfo> available_imes,
std::vector<ImeMenuItem> menu_items) override;
void SetImesManagedByPolicy(bool managed) override;
void ShowImeMenuOnShelf(bool show) override;
void UpdateCapsLockState(bool caps_enabled) override;
void OnKeyboardLayoutNameChanged(const std::string& layout_name) override;
void OnKeyboardEnabledChanged(bool is_enabled) override;
void SetExtraInputOptionsEnabledState(bool is_extra_input_options_enabled,
bool is_emoji_enabled,
bool is_handwriting_enabled,
bool is_voice_enabled) override;
void ShowModeIndicator(const gfx::Rect& anchor_bounds,
const std::u16string& ime_short_name) override;
bool IsCapsLockEnabled() const override;
const std::string& keyboard_layout_name() const {
return keyboard_layout_name_;
}
ModeIndicatorObserver* mode_indicator_observer() const {
return mode_indicator_observer_.get();
}
private:
std::vector<std::string> GetCandidateImesForAccelerator(
const ui::Accelerator& accelerator) const;
raw_ptr<ImeControllerClient> client_ = nullptr;
ImeInfo current_ime_;
std::vector<ImeInfo> available_imes_;
std::vector<ImeInfo> visible_imes_;
bool managed_by_policy_ = false;
std::vector<ImeMenuItem> current_ime_menu_items_;
bool is_caps_lock_enabled_ = false;
std::string keyboard_layout_name_;
bool is_extra_input_options_enabled_ = false;
bool is_emoji_enabled_ = false;
bool is_handwriting_enabled_ = false;
bool is_voice_enabled_ = false;
bool is_menu_active_ = false;
base::ObserverList<Observer>::Unchecked observers_;
std::unique_ptr<ModeIndicatorObserver> mode_indicator_observer_;
};
}
#endif