// 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.
#include "chrome/browser/ash/input_method/longpress_control_v_suggester.h"
#include <string>
#include "ash/constants/ash_features.h"
#include "chrome/browser/ash/input_method/longpress_suggester.h"
#include "chrome/browser/ash/input_method/suggestion_enums.h"
#include "chrome/browser/ash/input_method/suggestion_handler_interface.h"
#include "ui/base/ime/ash/ime_bridge.h"
#include "ui/base/ime/ash/text_input_target.h"
#include "ui/gfx/range/range.h"
namespace ash::input_method {
LongpressControlVSuggester::LongpressControlVSuggester(
SuggestionHandlerInterface* suggestion_handler)
: LongpressSuggester(suggestion_handler) {}
LongpressControlVSuggester::~LongpressControlVSuggester() = default;
void LongpressControlVSuggester::CachePastedTextStart() {
pasted_text_start_.reset();
TextInputTarget* input_context = IMEBridge::Get()->GetInputContextHandler();
if (!input_context) {
return;
}
pasted_text_start_ =
input_context->GetSurroundingTextInfo().selection_range.GetMin();
}
SuggestionStatus LongpressControlVSuggester::HandleKeyEvent(
const ui::KeyEvent& event) {
// The clipboard history controller handles the mouse and key events that
// allow users to select an item to paste.
return SuggestionStatus::kNotHandled;
}
bool LongpressControlVSuggester::TrySuggestWithSurroundingText(
const std::u16string& text,
const gfx::Range selection_range) {
// Pastes cause the surrounding text to change. Continue "suggesting" after
// such changes so that `this` remains the current suggester.
return true;
}
bool LongpressControlVSuggester::AcceptSuggestion(size_t index) {
if (!focused_context_id_.has_value()) {
LOG(ERROR) << "suggest: Accepted long-press Ctrl+V suggestion but had no "
"context to replace originally pasted content.";
Reset();
return true;
}
if (auto* input_context = IMEBridge::Get()->GetInputContextHandler();
input_context != nullptr && pasted_text_start_.has_value()) {
size_t pasted_text_end =
input_context->GetSurroundingTextInfo().selection_range.GetMin();
DCHECK_GE(pasted_text_end, *pasted_text_start_);
std::string error;
suggestion_handler_->AcceptSuggestionCandidate(
*focused_context_id_, /*candidate=*/u"",
/*delete_previous_utf16_len=*/pasted_text_end - *pasted_text_start_,
/*use_replace_surrounding_text=*/
base::FeatureList::IsEnabled(
features::kDiacriticsUseReplaceSurroundingText),
&error);
if (!error.empty()) {
LOG(ERROR) << "suggest: Accepted long-press Ctrl+V suggestion without "
"replacing originally pasted content: "
<< error;
}
} else {
LOG(ERROR) << "suggest: Accepted long-press Ctrl+V suggestion but could "
"not attempt to replace originally pasted content.";
}
Reset();
return true;
}
void LongpressControlVSuggester::DismissSuggestion() {
Reset();
}
AssistiveType LongpressControlVSuggester::GetProposeActionType() {
return AssistiveType::kLongpressControlV;
}
void LongpressControlVSuggester::Reset() {
pasted_text_start_.reset();
}
} // namespace ash::input_method