| // 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 <string> |
| |
| #include "base/android/jni_weak_ref.h" |
| #include "base/basictypes.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/singleton.h" |
| #include "chrome/browser/autocomplete/autocomplete_controller_delegate.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/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, |
| jobject obj, |
| jstring j_text, |
| jint j_cursor_pos, |
| jstring j_desired_tld, |
| jstring j_current_url, |
| bool prevent_inline_autocomplete, |
| bool prefer_keyword, |
| bool allow_exact_keyword_match, |
| bool best_match_only); |
| base::android::ScopedJavaLocalRef<jobject> Classify(JNIEnv* env, |
| jobject obj, |
| jstring j_text); |
| void OnOmniboxFocused(JNIEnv* env, |
| jobject obj, |
| jstring j_omnibox_text, |
| jstring j_current_url, |
| jboolean is_query_in_omnibox, |
| jboolean focused_from_fakebox); |
| void Stop(JNIEnv* env, jobject obj, bool clear_result); |
| void ResetSession(JNIEnv* env, jobject obj); |
| void OnSuggestionSelected(JNIEnv* env, |
| jobject obj, |
| jint selected_index, |
| jstring j_current_url, |
| jboolean is_query_in_omnibox, |
| jboolean focused_from_fakebox, |
| jlong elapsed_time_since_first_modified, |
| jobject j_web_contents); |
| void DeleteSuggestion(JNIEnv* env, jobject obj, int selected_index); |
| base::android::ScopedJavaLocalRef<jstring> |
| UpdateMatchDestinationURLWithQueryFormulationTime( |
| JNIEnv* env, |
| jobject 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 DefaultSingletonTraits<Factory>; |
| |
| 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<jobject> 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<jobject> GetTopSynchronousResult( |
| JNIEnv* env, |
| jobject obj, |
| jstring j_text, |
| bool prevent_inline_autocomplete); |
| |
| scoped_ptr<AutocompleteController> 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_ |