1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ 6#define CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ 7 8#include <string> 9 10#include "base/android/jni_weak_ref.h" 11#include "base/basictypes.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/memory/singleton.h" 14#include "chrome/browser/autocomplete/autocomplete_controller_delegate.h" 15#include "chrome/browser/autocomplete/autocomplete_input.h" 16#include "components/keyed_service/content/browser_context_keyed_service_factory.h" 17#include "components/keyed_service/core/keyed_service.h" 18#include "components/metrics/proto/omnibox_event.pb.h" 19#include "content/public/browser/notification_observer.h" 20#include "content/public/browser/notification_registrar.h" 21#include "content/public/browser/notification_service.h" 22 23class AutocompleteController; 24struct AutocompleteMatch; 25class AutocompleteResult; 26class Profile; 27class Tab; 28 29// The native part of the Java AutocompleteController class. 30class AutocompleteControllerAndroid : public AutocompleteControllerDelegate, 31 public KeyedService { 32 public: 33 explicit AutocompleteControllerAndroid(Profile* profile); 34 35 // Methods that forward to AutocompleteController: 36 void Start(JNIEnv* env, 37 jobject obj, 38 jstring j_text, 39 jstring j_desired_tld, 40 jstring j_current_url, 41 bool prevent_inline_autocomplete, 42 bool prefer_keyword, 43 bool allow_exact_keyword_match, 44 bool best_match_only); 45 base::android::ScopedJavaLocalRef<jobject> Classify(JNIEnv* env, 46 jobject obj, 47 jstring j_text); 48 void StartZeroSuggest(JNIEnv* env, 49 jobject obj, 50 jstring j_omnibox_text, 51 jstring j_current_url, 52 jboolean is_query_in_omnibox, 53 jboolean focused_from_fakebox); 54 void Stop(JNIEnv* env, jobject obj, bool clear_result); 55 void ResetSession(JNIEnv* env, jobject obj); 56 void OnSuggestionSelected(JNIEnv* env, 57 jobject obj, 58 jint selected_index, 59 jstring j_current_url, 60 jboolean is_query_in_omnibox, 61 jboolean focused_from_fakebox, 62 jlong elapsed_time_since_first_modified, 63 jobject j_web_contents); 64 void DeleteSuggestion(JNIEnv* env, jobject obj, int selected_index); 65 base::android::ScopedJavaLocalRef<jstring> UpdateMatchDestinationURL( 66 JNIEnv* env, 67 jobject obj, 68 jint selected_index, 69 jlong elapsed_time_since_input_change); 70 71 base::android::ScopedJavaLocalRef<jobject> GetTopSynchronousMatch( 72 JNIEnv* env, 73 jobject obj, 74 jstring query); 75 76 // KeyedService: 77 virtual void Shutdown() OVERRIDE; 78 79 class Factory : public BrowserContextKeyedServiceFactory { 80 public: 81 static AutocompleteControllerAndroid* GetForProfile(Profile* profile, 82 JNIEnv* env, 83 jobject obj); 84 85 static Factory* GetInstance(); 86 87 protected: 88 virtual content::BrowserContext* GetBrowserContextToUse( 89 content::BrowserContext* context) const OVERRIDE; 90 91 private: 92 friend struct DefaultSingletonTraits<Factory>; 93 94 Factory(); 95 virtual ~Factory(); 96 97 // BrowserContextKeyedServiceFactory 98 virtual KeyedService* BuildServiceInstanceFor( 99 content::BrowserContext* profile) const OVERRIDE; 100 }; 101 102 private: 103 virtual ~AutocompleteControllerAndroid(); 104 void InitJNI(JNIEnv* env, jobject obj); 105 106 // AutocompleteControllerDelegate implementation. 107 virtual void OnResultChanged(bool default_match_changed) OVERRIDE; 108 109 // Notifies the Java AutocompleteController that suggestions were received 110 // based on the text the user typed in last. 111 void NotifySuggestionsReceived( 112 const AutocompleteResult& autocomplete_result); 113 114 // Classifies the type of page we are on. 115 metrics::OmniboxEventProto::PageClassification ClassifyPage( 116 const GURL& gurl, 117 bool is_query_in_omnibox, 118 bool focused_from_fakebox) const; 119 120 base::android::ScopedJavaLocalRef<jobject> BuildOmniboxSuggestion( 121 JNIEnv* env, const AutocompleteMatch& match); 122 123 // Converts destination_url (which is in its canonical form or punycode) to a 124 // user-friendly URL by looking up accept languages of the current profile. 125 // e.g. http://xn--6q8b.kr/ --> 한.kr 126 base::string16 FormatURLUsingAcceptLanguages(GURL url); 127 128 // A helper method for fetching the top synchronous autocomplete result. 129 // The |prevent_inline_autocomplete| flag is passed to the AutocompleteInput 130 // object, see documentation there for its description. 131 base::android::ScopedJavaLocalRef<jobject> GetTopSynchronousResult( 132 JNIEnv* env, 133 jobject obj, 134 jstring j_text, 135 bool prevent_inline_autocomplete); 136 137 scoped_ptr<AutocompleteController> autocomplete_controller_; 138 139 // Last input we sent to the autocomplete controller. 140 AutocompleteInput input_; 141 142 // Whether we're currently inside a call to Start() that's called 143 // from GetTopSynchronousResult(). 144 bool inside_synchronous_start_; 145 146 JavaObjectWeakGlobalRef weak_java_autocomplete_controller_android_; 147 Profile* profile_; 148 149 DISALLOW_COPY_AND_ASSIGN(AutocompleteControllerAndroid); 150}; 151 152// Registers the LocationBar native method. 153bool RegisterAutocompleteControllerAndroid(JNIEnv* env); 154 155#endif // CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_ 156