// Copyright 2013 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.

package org.chromium.chrome.browser.omnibox;

import org.chromium.chrome.browser.TabBase;
import org.chromium.chrome.browser.profiles.Profile;

/**
 * Java bridge to handle conditional prerendering using autocomplete results * as the user types
 * into the Omnibox.
 *
 * OmniboxPrerender takes keystrokes, autocomplete results and navigation actions then feeds
 * them to the (native) AutocompleteActionPredictor. The predictor uses this data to update its
 * database and returns predictions on what page, if any, to pre-render or pre-connect.
 *
 */
public class OmniboxPrerender {
    private long mNativeOmniboxPrerender = 0;

    /**
     * Constructor for creating a OmniboxPrerender instanace.
     */
    public OmniboxPrerender() {
        mNativeOmniboxPrerender = nativeInit();
    }

    /**
     * Clears the transitional matches. This should be called when the user stops typing into
     * the omnibox (e.g. when navigating away, closing the keyboard or changing tabs)
     *
     * @param profile profile instance corresponding to the active profile.
     */
    public void clear(Profile profile) {
        nativeClear(mNativeOmniboxPrerender, profile);
    }

    /**
     * Initializes the underlying action predictor for a given profile instance. This should be
     * called as soon as possible as the predictor must register for certain notifications to
     * properly initialize before providing predictions and updated its learning database.
     *
     * @param profile profile instance corresponding to active profile.
     */
    public void initializeForProfile(Profile profile) {
        nativeInitializeForProfile(mNativeOmniboxPrerender, profile);
    }

    /**
     * Potentailly invokes a pre-render or pre-connect given the url typed into the omnibox and
     * a corresponding autocomplete result. This should be invoked everytime the omnibox changes
     * (e.g. As the user types characters this method should be invoked at least once per character)
     *
     * @param url url in the omnibox.
     * @param currentUrl url the current tab is displaying.
     * @param nativeAutocompleteResult native pointer to an autocomplete result.
     * @param profile profile instance corresponding to the active profile.
     * @param tab The tab whose webcontent's to use.
     */
    public void prerenderMaybe(String url, String currentUrl, long nativeAutocompleteResult,
            Profile profile, TabBase tab) {
        nativePrerenderMaybe(mNativeOmniboxPrerender, url, currentUrl, nativeAutocompleteResult,
                profile, tab);
    }

    private native long nativeInit();
    private native void nativeClear(long nativeOmniboxPrerender, Profile profile);
    private native void nativeInitializeForProfile(
            long nativeOmniboxPrerender,
            Profile profile);
    private native void nativePrerenderMaybe(long nativeOmniboxPrerender, String url,
            String currentUrl, long nativeAutocompleteResult, Profile profile,
            TabBase tab);
}
