#ifndef CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_
#define CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_
#include <memory>
#include "base/android/jni_android.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/android/omnibox/composebox_query_controller_bridge.h"
#include "chrome/browser/profiles/profile_keyed_service_factory.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/omnibox/browser/autocomplete_controller.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "content/public/browser/browser_context.h"
#include "third_party/omnibox_proto/aim_tools_and_models.pb.h"
class AutocompleteResult;
class ChromeAutocompleteProviderClient;
class Profile;
namespace base {
template <typename Type>
struct DefaultSingletonTraits;
}
class AutocompleteControllerAndroid : public AutocompleteController::Observer,
public KeyedService {
public:
AutocompleteControllerAndroid(
Profile* profile,
std::unique_ptr<ChromeAutocompleteProviderClient> client,
bool is_low_memory_device);
AutocompleteControllerAndroid(const AutocompleteControllerAndroid&) = delete;
AutocompleteControllerAndroid& operator=(
const AutocompleteControllerAndroid&) = delete;
~AutocompleteControllerAndroid() override;
void Start(
JNIEnv* env,
const base::android::JavaRef<jstring>& j_text,
jint j_cursor_pos,
const base::android::JavaRef<jstring>& j_desired_tld,
const base::android::JavaRef<jstring>& j_current_url,
::metrics::OmniboxEventProto::PageClassification page_classification,
omnibox::ChromeAimToolsAndModels tool_mode,
bool prevent_inline_autocomplete,
bool prefer_keyword,
bool allow_exact_keyword_match,
bool want_asynchronous_matches);
void StartPrefetch(
JNIEnv* env,
const base::android::JavaRef<jstring>& j_current_url,
::metrics::OmniboxEventProto::PageClassification page_classification,
const base::android::JavaParamRef<jobject>& j_web_contents);
base::android::ScopedJavaLocalRef<jobject> Classify(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& j_text);
void OnOmniboxFocused(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& j_omnibox_text,
const base::android::JavaParamRef<jstring>& j_current_url,
::metrics::OmniboxEventProto::PageClassification page_classification,
omnibox::ChromeAimToolsAndModels tool_mode,
const base::android::JavaParamRef<jstring>& j_current_title);
void Stop(JNIEnv* env, bool clear_result);
void ResetSession(JNIEnv* env);
void OnSuggestionSelected(
JNIEnv* env,
uintptr_t match_ptr,
int suggestion_line,
const jint j_window_open_disposition,
const base::android::JavaParamRef<jstring>& j_current_url,
::metrics::OmniboxEventProto::PageClassification page_classification,
jlong elapsed_time_since_first_modified,
jint completed_length,
const base::android::JavaParamRef<jobject>& j_web_contents,
jlong omnibox_action_ptr);
jboolean OnSuggestionTouchDown(
JNIEnv* env,
uintptr_t match_ptr,
int match_index,
const base::android::JavaParamRef<jobject>& j_web_contents);
void DeleteMatch(JNIEnv* env, uintptr_t match_ptr);
void DeleteMatchElement(JNIEnv* env, uintptr_t match_ptr, jint element_index);
base::android::ScopedJavaLocalRef<jobject>
UpdateMatchDestinationURLWithAdditionalSearchboxStats(
JNIEnv* env,
uintptr_t match_ptr,
jlong elapsed_time_since_input_change);
base::android::ScopedJavaLocalRef<jobject> GetAnswerActionDestinationURL(
JNIEnv* env,
uintptr_t match_ptr,
jlong elapsed_time_since_input_change,
uintptr_t answer_action_ptr);
base::android::ScopedJavaLocalRef<jobject> GetMatchingTabForSuggestion(
JNIEnv* env,
uintptr_t match_ptr);
void Shutdown() override;
static void EnsureFactoryBuilt();
void SetComposeboxQueryControllerBridge(
JNIEnv* env,
uintptr_t composebox_controller_bridge_ptr);
void SetVoiceMatches(
JNIEnv* env,
const base::android::JavaParamRef<jobjectArray>& j_voice_matches,
const base::android::JavaParamRef<jfloatArray>& j_confidence_scores);
void OnSuggestionDropdownHeightChanged(
JNIEnv* env,
jint dropdown_height_with_keyboard_active_px,
jint suggestion_height_px);
void CreateNavigationObserver(JNIEnv* env,
uintptr_t navigation_handle_ptr,
uintptr_t match_ptr);
base::android::ScopedJavaLocalRef<jobject> GetJavaObject() const;
template <typename T>
T* SetAutocompleteControllerForTesting(
std::unique_ptr<T> autocomplete_controller) {
T* result = autocomplete_controller.get();
autocomplete_controller_ = std::move(autocomplete_controller);
return result;
}
AutocompleteController* autocomplete_controller_for_test() {
return autocomplete_controller_.get();
}
class Factory : public ProfileKeyedServiceFactory {
public:
static AutocompleteControllerAndroid* GetForProfile(Profile* profile);
static Factory* GetInstance();
private:
friend struct base::DefaultSingletonTraits<Factory>;
Factory();
~Factory() override;
std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext(
content::BrowserContext* profile) const override;
};
private:
void OnResultChanged(AutocompleteController* controller,
bool default_match_changed) override;
void NotifySuggestionsReceived(const AutocompleteResult& autocomplete_result);
void WarmUpRenderProcess() const;
const bool is_low_memory_device_{};
AutocompleteInput input_{};
bool inside_synchronous_start_{false};
const raw_ptr<Profile> profile_;
const base::android::ScopedJavaGlobalRef<jobject> java_controller_;
std::unique_ptr<AutocompleteController> autocomplete_controller_;
base::WeakPtr<ComposeboxQueryControllerBridge>
composebox_query_controller_bridge_;
base::WeakPtrFactory<AutocompleteControllerAndroid> weak_ptr_factory_{this};
};
#endif