blob: de5fec8b5b72cf7e2303c38f87c14e9da011eb30 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/contextualsearch/contextual_search_context.h"
#include "base/android/jni_string.h"
#include "chrome/android/chrome_jni_headers/ContextualSearchContext_jni.h"
#include "components/translate/core/common/translate_constants.h"
#include "components/translate/core/language_detection/language_detection_util.h"
#include "content/public/browser/browser_thread.h"
ContextualSearchContext::ContextualSearchContext(JNIEnv* env, jobject obj) {
java_object_.Reset(env, obj);
}
ContextualSearchContext::ContextualSearchContext(
const std::string& home_country,
const GURL& page_url,
const std::string& encoding)
: can_resolve_(true),
can_send_base_page_url_(true),
home_country_(home_country),
base_page_url_(page_url),
base_page_encoding_(encoding) {
java_object_ = nullptr;
}
ContextualSearchContext::~ContextualSearchContext() {
}
// static
base::WeakPtr<ContextualSearchContext>
ContextualSearchContext::FromJavaContextualSearchContext(
const base::android::JavaRef<jobject>& j_contextual_search_context) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (j_contextual_search_context.is_null())
return NULL;
ContextualSearchContext* contextual_search_context =
reinterpret_cast<ContextualSearchContext*>(
Java_ContextualSearchContext_getNativePointer(
base::android::AttachCurrentThread(),
j_contextual_search_context));
return contextual_search_context->GetWeakPtr();
}
void ContextualSearchContext::SetResolveProperties(
JNIEnv* env,
jobject obj,
const base::android::JavaParamRef<jstring>& j_home_country,
jboolean j_may_send_base_page_url,
jlong j_previous_event_id,
jint j_previous_event_results) {
can_resolve_ = true;
home_country_ = base::android::ConvertJavaStringToUTF8(env, j_home_country);
can_send_base_page_url_ = j_may_send_base_page_url;
previous_event_id_ = j_previous_event_id;
previous_event_results_ = j_previous_event_results;
}
void ContextualSearchContext::AdjustSelection(JNIEnv* env,
jobject obj,
jint j_start_adjust,
jint j_end_adjust) {
DCHECK(start_offset_ + j_start_adjust >= 0);
DCHECK(start_offset_ + j_start_adjust <= (int)surrounding_text_.length());
DCHECK(end_offset_ + j_end_adjust >= 0);
DCHECK(end_offset_ + j_end_adjust <= (int)surrounding_text_.length());
start_offset_ += j_start_adjust;
end_offset_ += j_end_adjust;
}
// Accessors
bool ContextualSearchContext::CanResolve() const {
return can_resolve_;
}
bool ContextualSearchContext::CanSendBasePageUrl() const {
return can_send_base_page_url_;
}
const GURL ContextualSearchContext::GetBasePageUrl() const {
return base_page_url_;
}
void ContextualSearchContext::SetBasePageUrl(const GURL& base_page_url) {
this->base_page_url_ = base_page_url;
}
const std::string ContextualSearchContext::GetBasePageEncoding() const {
return base_page_encoding_;
}
void ContextualSearchContext::SetBasePageEncoding(
const std::string& base_page_encoding) {
this->base_page_encoding_ = base_page_encoding;
}
const std::string ContextualSearchContext::GetHomeCountry() const {
return home_country_;
}
int64_t ContextualSearchContext::GetPreviousEventId() const {
return previous_event_id_;
}
int ContextualSearchContext::GetPreviousEventResults() const {
return previous_event_results_;
}
void ContextualSearchContext::SetSelectionSurroundings(
int start_offset,
int end_offset,
const std::u16string& surrounding_text) {
this->start_offset_ = start_offset;
this->end_offset_ = end_offset;
this->surrounding_text_ = surrounding_text;
}
const std::u16string ContextualSearchContext::GetSurroundingText() const {
return surrounding_text_;
}
int ContextualSearchContext::GetStartOffset() const {
return start_offset_;
}
int ContextualSearchContext::GetEndOffset() const {
return end_offset_;
}
void ContextualSearchContext::PrepareToResolve(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jboolean j_is_exact_resolve,
const base::android::JavaParamRef<jstring>& j_related_searches_stamp) {
is_exact_resolve_ = j_is_exact_resolve;
related_searches_stamp_ =
base::android::ConvertJavaStringToUTF8(env, j_related_searches_stamp);
do_related_searches_ = !related_searches_stamp_.empty();
}
bool ContextualSearchContext::GetExactResolve() const {
return is_exact_resolve_;
}
base::android::ScopedJavaLocalRef<jstring>
ContextualSearchContext::DetectLanguage(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) const {
std::string language = GetReliableLanguage(GetSelection());
if (language.empty())
language = GetReliableLanguage(this->surrounding_text_);
base::android::ScopedJavaLocalRef<jstring> j_language =
base::android::ConvertUTF8ToJavaString(env, language);
return j_language;
}
void ContextualSearchContext::SetTranslationLanguages(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_detected_language,
const base::android::JavaParamRef<jstring>& j_target_language,
const base::android::JavaParamRef<jstring>& j_fluent_languages) {
translation_languages_.detected_language =
base::android::ConvertJavaStringToUTF8(env, j_detected_language);
translation_languages_.target_language =
base::android::ConvertJavaStringToUTF8(env, j_target_language);
translation_languages_.fluent_languages =
base::android::ConvertJavaStringToUTF8(env, j_fluent_languages);
}
const ContextualSearchContext::TranslationLanguages&
ContextualSearchContext::GetTranslationLanguages() const {
return translation_languages_;
}
std::string ContextualSearchContext::GetReliableLanguage(
const std::u16string& contents) const {
std::string model_detected_language;
bool is_model_reliable;
float model_reliability_score;
std::string language = translate::DeterminePageLanguage(
/*content_language=*/std::string(),
/*html_lang=*/std::string(), contents, &model_detected_language,
&is_model_reliable, model_reliability_score);
// Make sure we return an empty string when unreliable or an unknown result.
if (!is_model_reliable || language == translate::kUnknownLanguageCode)
language = "";
return language;
}
std::u16string ContextualSearchContext::GetSelection() const {
int start = this->start_offset_;
int end = this->end_offset_;
DCHECK(start >= 0);
DCHECK(end >= 0);
DCHECK(end <= (int)this->surrounding_text_.length());
DCHECK(start <= end);
return this->surrounding_text_.substr(start, end - start);
}
bool ContextualSearchContext::GetRelatedSearches() const {
return do_related_searches_;
}
const std::string ContextualSearchContext::GetRelatedSearchesStamp() const {
return related_searches_stamp_;
}
// Boilerplate.
base::WeakPtr<ContextualSearchContext> ContextualSearchContext::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
// Java wrapper boilerplate
void ContextualSearchContext::Destroy(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
delete this;
}
jlong JNI_ContextualSearchContext_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
ContextualSearchContext* context = new ContextualSearchContext(env, obj);
return reinterpret_cast<intptr_t>(context);
}