blob: 5b9d776948842bcab25196b61a261320510f94fb [file] [log] [blame]
// 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 <memory>
#include <string>
#include "base/android/jni_weak_ref.h"
#include "base/macros.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/omnibox/browser/autocomplete_controller.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"
#include "third_party/metrics_proto/omnibox_event.pb.h"
class AutocompleteController;
struct AutocompleteMatch;
class AutocompleteResult;
class ChromeAutocompleteProviderClient;
class Profile;
// The native part of the Java AutocompleteController class.
class AutocompleteControllerAndroid : public AutocompleteController::Observer,
public KeyedService {
public:
explicit AutocompleteControllerAndroid(Profile* profile);
// Methods that forward to AutocompleteController:
void Start(JNIEnv* env,
const base::android::JavaRef<jobject>& obj,
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,
jint j_page_classification,
bool prevent_inline_autocomplete,
bool prefer_keyword,
bool allow_exact_keyword_match,
bool want_asynchronous_matches,
const base::android::JavaRef<jstring>& j_query_tile_id,
bool is_query_started_from_tiles);
base::android::ScopedJavaLocalRef<jobject> Classify(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_text,
bool focused_from_fakebox);
void OnOmniboxFocused(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_omnibox_text,
const base::android::JavaParamRef<jstring>& j_current_url,
jint j_page_classification,
const base::android::JavaParamRef<jstring>& j_current_title);
void Stop(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
bool clear_result);
void ResetSession(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void OnSuggestionSelected(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint selected_index,
const jint j_window_open_disposition,
const base::android::JavaParamRef<jstring>& j_current_url,
jint j_page_classification,
jlong elapsed_time_since_first_modified,
jint completed_length,
const base::android::JavaParamRef<jobject>& j_web_contents);
void DeleteSuggestion(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint selected_index);
base::android::ScopedJavaLocalRef<jobject>
UpdateMatchDestinationURLWithQueryFormulationTime(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jint selected_index,
jlong elapsed_time_since_input_change,
const base::android::JavaParamRef<jstring>& jnew_query_text,
const base::android::JavaParamRef<jobjectArray>& jnew_query_params);
base::android::ScopedJavaLocalRef<jobject> FindMatchingTabWithUrl(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_gurl);
// Break the association between the AutocompleteController java and
// native instances.
void ReleaseJavaObject(JNIEnv* env);
// 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();
~Factory() override;
// BrowserContextKeyedServiceFactory
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* profile) const override;
};
// Pass detected voice matches down to VoiceSuggestionsProvider.
void SetVoiceMatches(
JNIEnv* env,
const base::android::JavaParamRef<jobjectArray>& j_voice_matches,
const base::android::JavaParamRef<jfloatArray>& j_confidence_scores);
private:
~AutocompleteControllerAndroid() override;
void InitJNI(JNIEnv* env, jobject obj);
// AutocompleteController::Observer implementation.
void OnResultChanged(AutocompleteController* controller,
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);
std::unique_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 Classify().
bool inside_synchronous_start_;
JavaObjectWeakGlobalRef weak_java_autocomplete_controller_android_;
Profile* profile_;
ChromeAutocompleteProviderClient* provider_client_;
// Whether the omnibox input is a query that starts building
// by clicking on an image tile.
bool is_query_started_from_tiles_ = false;
DISALLOW_COPY_AND_ASSIGN(AutocompleteControllerAndroid);
};
#endif // CHROME_BROWSER_ANDROID_OMNIBOX_AUTOCOMPLETE_CONTROLLER_ANDROID_H_