// Copyright 2014 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. #ifndef CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ #define CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ #include #include "base/android/jni_weak_ref.h" #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/keyed_service/core/keyed_service.h" #include "components/metrics/proto/omnibox_event.pb.h" #include "components/omnibox/browser/autocomplete_controller_delegate.h" #include "components/omnibox/browser/autocomplete_input.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" class AutocompleteController; struct AutocompleteMatch; class AutocompleteResult; class Profile; class Tab; // The native part of the Java AutocompleteController class. class AutocompleteControllerAndroid : public AutocompleteControllerDelegate, public KeyedService { public: explicit AutocompleteControllerAndroid(Profile* profile); // Methods that forward to AutocompleteController: void Start(JNIEnv* env, const base::android::JavaRef& obj, const base::android::JavaRef& j_text, jint j_cursor_pos, const base::android::JavaRef& j_desired_tld, const base::android::JavaRef& j_current_url, bool prevent_inline_autocomplete, bool prefer_keyword, bool allow_exact_keyword_match, bool best_match_only); base::android::ScopedJavaLocalRef Classify( JNIEnv* env, const base::android::JavaParamRef& obj, const base::android::JavaParamRef& j_text); void OnOmniboxFocused( JNIEnv* env, const base::android::JavaParamRef& obj, const base::android::JavaParamRef& j_omnibox_text, const base::android::JavaParamRef& j_current_url, jboolean is_query_in_omnibox, jboolean focused_from_fakebox); void Stop(JNIEnv* env, const base::android::JavaParamRef& obj, bool clear_result); void ResetSession(JNIEnv* env, const base::android::JavaParamRef& obj); void OnSuggestionSelected( JNIEnv* env, const base::android::JavaParamRef& obj, jint selected_index, const base::android::JavaParamRef& j_current_url, jboolean is_query_in_omnibox, jboolean focused_from_fakebox, jlong elapsed_time_since_first_modified, const base::android::JavaParamRef& j_web_contents); void DeleteSuggestion(JNIEnv* env, const base::android::JavaParamRef& obj, int selected_index); base::android::ScopedJavaLocalRef UpdateMatchDestinationURLWithQueryFormulationTime( JNIEnv* env, const base::android::JavaParamRef& obj, jint selected_index, jlong elapsed_time_since_input_change); // KeyedService: void Shutdown() override; class Factory : public BrowserContextKeyedServiceFactory { public: static AutocompleteControllerAndroid* GetForProfile(Profile* profile, JNIEnv* env, jobject obj); static Factory* GetInstance(); protected: content::BrowserContext* GetBrowserContextToUse( content::BrowserContext* context) const override; private: friend struct base::DefaultSingletonTraits; Factory(); ~Factory() override; // BrowserContextKeyedServiceFactory KeyedService* BuildServiceInstanceFor( content::BrowserContext* profile) const override; }; private: ~AutocompleteControllerAndroid() override; void InitJNI(JNIEnv* env, jobject obj); // AutocompleteControllerDelegate implementation. void OnResultChanged(bool default_match_changed) override; // Notifies the Java AutocompleteController that suggestions were received // based on the text the user typed in last. void NotifySuggestionsReceived( const AutocompleteResult& autocomplete_result); // Classifies the type of page we are on. metrics::OmniboxEventProto::PageClassification ClassifyPage( const GURL& gurl, bool is_query_in_omnibox, bool focused_from_fakebox) const; base::android::ScopedJavaLocalRef BuildOmniboxSuggestion( JNIEnv* env, const AutocompleteMatch& match); // Converts destination_url (which is in its canonical form or punycode) to a // user-friendly URL by looking up accept languages of the current profile. // e.g. http://xn--6q8b.kr/ --> 한.kr base::string16 FormatURLUsingAcceptLanguages(GURL url); // A helper method for fetching the top synchronous autocomplete result. // The |prevent_inline_autocomplete| flag is passed to the AutocompleteInput // object, see documentation there for its description. base::android::ScopedJavaLocalRef GetTopSynchronousResult( JNIEnv* env, const base::android::JavaRef& obj, const base::android::JavaRef& j_text, bool prevent_inline_autocomplete); scoped_ptr autocomplete_controller_; // Last input we sent to the autocomplete controller. AutocompleteInput input_; // Whether we're currently inside a call to Start() that's called // from GetTopSynchronousResult(). bool inside_synchronous_start_; JavaObjectWeakGlobalRef weak_java_autocomplete_controller_android_; Profile* profile_; DISALLOW_COPY_AND_ASSIGN(AutocompleteControllerAndroid); }; // Registers the LocationBar native method. bool RegisterAutocompleteControllerAndroid(JNIEnv* env); #endif // CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_