blob: 3223fff11bdba0ebdd3f8aaa39a252164daf0dfe [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "search_resumption_module_bridge.h"
#include "base/android/jni_array.h"
#include "base/functional/bind.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/search_resumption/jni_headers/SearchResumptionModuleBridge_jni.h"
#include "chrome/browser/search_resumption/start_suggest_service_factory.h"
#include "components/search/start_suggest_service.h"
#include "components/search_engines/search_terms_data.h"
#include "url/android/gurl_android.h"
using base::android::JavaParamRef;
using base::android::JavaRef;
using RequestSource = SearchTermsData::RequestSource;
namespace search_resumption_module {
SearchResumptionModuleBridge::SearchResumptionModuleBridge(JNIEnv* env,
jobject jobj,
Profile* profile)
: java_object_(env, env->NewWeakGlobalRef(jobj)) {
CHECK(!profile->IsOffTheRecord());
start_suggest_service_ =
StartSuggestServiceFactory::GetInstance()->GetForBrowserContext(profile);
}
void SearchResumptionModuleBridge::Destroy(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
delete this;
}
void SearchResumptionModuleBridge::FetchSuggestions(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& j_page_url) {
if (start_suggest_service_ == nullptr) {
return;
}
TemplateURLRef::SearchTermsArgs args;
args.request_source = RequestSource::NTP_MODULE;
args.current_page_url = ConvertJavaStringToUTF8(env, j_page_url);
start_suggest_service_->FetchSuggestions(
args,
base::BindOnce(&SearchResumptionModuleBridge::OnSuggestionsReceived,
weak_ptr_factory_.GetMutableWeakPtr()),
true /* fetch_from_server */);
}
SearchResumptionModuleBridge::~SearchResumptionModuleBridge() = default;
void SearchResumptionModuleBridge::OnSuggestionsReceived(
std::vector<QuerySuggestion> suggestions) {
JNIEnv* env = base::android::AttachCurrentThread();
std::vector<std::u16string> titles;
titles.reserve(suggestions.size());
std::vector<base::android::ScopedJavaLocalRef<jobject>> urls;
urls.reserve(suggestions.size());
for (const auto& suggestion : suggestions) {
titles.push_back(suggestion.query);
urls.push_back(
url::GURLAndroid::FromNativeGURL(env, suggestion.destination_url));
}
Java_SearchResumptionModuleBridge_onSuggestionsReceived(
env, java_object_, base::android::ToJavaArrayOfStrings(env, titles),
url::GURLAndroid::ToJavaArrayOfGURLs(env, urls));
}
static jlong JNI_SearchResumptionModuleBridge_Create(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& jprofile) {
SearchResumptionModuleBridge* native_bridge =
new SearchResumptionModuleBridge(
env, obj, ProfileAndroid::FromProfileAndroid(jprofile));
return reinterpret_cast<intptr_t>(native_bridge);
}
} // namespace search_resumption_module